2011-08-04 16 views
2

内部関数を動的に(名前で)呼び出すことは可能ですか?内部関数をjavacriptで動的に呼び出す

function a(){ 
    function b(){..} 
    var funcName = "b"; 
    //calling the function b somehow using funcName 
} 

bはグローバル関数であった場合ならば、私は、[FUNCNAME]またはグローバル[FUNCNAME] ...

答えて

1

まあウィンドウを使用することができ、私はそれがevalのを使用することにより可能です知っているが、私はむしろ、evalを使用していませんそれほど難しくないと宣言することができます:

function a(){ 
    this.b = function() {...}; 

    // dynamic access 
    var funcName = "b"; 
    this[funcName](); 

    // still need static access? 
    var b = this.b; 
    b(); 
} 

もちろん混在することができます。しかし、関数は単なるオブジェクト(abの両方)なので、割り当て、移動、さらにはインスタンスメンバーを持つことができます。

+0

これは、 'a'の呼び出しコンテキスト(例えば、' this'が指しているもの)によって異なって動作するので、私はその構造体を推奨しません。 –

1

thisでマックしない熱心の答えのバリエーション:

function a(){ 
    function b(){..} 
    var internalFuncs = {"b": b} 
    var funcName = "b" 
    internalFuncs[funcName]() 
} 

ハッピーコーディング。

1

別のアプローチ:

var a = (function() { 
    return { 
     b: function() { alert("b"); }, 
     c: function() { alert("c"); }, 
     d: function() { alert("d"); } 
    } 
})(); 

a["b"](); 

フィドル:あなたは別の構造体に名前bを記録せず、魔法の名前("b")を介してbにアクセスするようにhttp://jsfiddle.net/raSKW/

2

が鳴ります。

グローバル変数がグローバルオブジェクトのプロパティであることは間違いありません。通常は、Web環境の識別子windowでアクセスします。 windowは、それ自身を指すグローバルオブジェクトのプロパティですが、それはトピックではありません。

ローカル変数もオブジェクトのプロパティです。呼び出しオブジェクトです。このオブジェクトは、通話中に一時的に存在します。呼び出しオブジェクトに直接アクセスすることができた場合は、はtheCallObject[funcName]と言うことができます。なぜなら、ネストされた関数は依然としてローカル変数であるからです。悲しいかな、このオブジェクトは直接アクセスできないため、基本的には以前の回答に示されているテクニックに戻る必要があります。

ここに情報付きの質問があります:How to output call object in javascript?です。

Mozillaが私たちに非標準の__proto__を与えたのと同じように、呼び出しオブジェクトにアクセスできる拡張機能を持つJSエンジンを書くことができるとします。

+1

これは非常に明確だとは思わなかったので、*ローカル変数*はソートのオブジェクトに格納されていますが*この詳細はJavaScript *では公開されていませんが、仕様の中で述べられていますが異なる方法で実装されています。たとえば、最適化とクロージャーの最小化は、公開されていないためです。 (唯一の例外は 'arguments [n]'です。ここで 'n'は数値インデックスです。関数のパラメータであり、' var'の値ではありません)。 –

+1

それを買うよ、@pst。呼び出しオブジェクトが仕様で説明されているという事実は、実際にJavaScriptオブジェクトとして実装されている必要はありません。これは、セマンティクスを説明するのに役立ちます。けっこうだ。完全に。 **私は**アクセス**が**実装されて**与えられていれば** OPが望んでいたことをすることができる**という私の発言に立つつもりです。今のように、そのような魔法はない、と私は信じている。あなたの技術的なコメントは+1です。 –

+0

そのような場合には、実際には可能でしょう;-) Pythonには、提案されているものだけを行うことができる、あまり知られていない 'locals()'関数があります(Pythonの実行時は変更が伝播する)別のノートでは、リンクされたSOの質問/回答が "呼び出しオブジェクト"を混ぜています - 私は引用と答えが異なるコンテキストで使用されるので引用符を使用します - と*アクティベーションオブジェクト*。 (*起動オブジェクト*は 'this'ではありません。) –