他の人が述べたように、これはプロパティ アクセサー演算子- "[" および "]" で行われます。この場合に重要なのは、この関数がどのように宣言され、どこから参照されているかです。
グローバルに宣言されている場合(つまり、関数宣言または関数式としてグローバル スコープ内で)、またはある時点でグローバル オブジェクトのプロパティに割り当てられている場合、グローバル オブジェクトのプロパティとしてアクセスできます。3番目に。ECMAScript-262 のエディションでは、次のような式でグローバル オブジェクトにアクセスできます。
(function(){ return this; })();
// or just `this` when in global scope
(ブラウザーでは、グローバル オブジェクトは通常、 global によって参照されるオブジェクトと同じであることに注意してくださいwindow
。ただし、そうである必要はありません)。
したがって、次のようにグローバル関数にアクセスします。
var globalObj = (function(){ return this; })();
globalObj['your_func'];
// or via `window`
window['your_func'];
通常、関数がローカルで宣言されている場合、つまり別の関数本体で問題が発生します。
(function(){
function your_func(){};
// how to access `your_func` here?
});
この問題は基本的に、(前の例のように) グローバル オブジェクトにアクセスすることはできますが、関数の変数オブジェクト(つまり、関数コードで変数および関数宣言の「ベース」として使用されるオブジェクト) にアクセスすることはできないという事実によるものです。 .
そのような場合には確かeval
に使用できますが、それは間違いなく問題に対する間違ったアプローチです。はるかに簡単で、互換性が高く、実行効率の高い方法は、関数をローカル オブジェクトのプロパティとしてアタッチすることです。
(function(){
...
function your_func(){}
var funcs = { your_func: your_func };
...
})();
次に、まったく同じ括弧を使用してプロパティにアクセスします – 問題のプロパティ参照関数:
funcs['your_func'];