正如其他人所提到的,这是通过属性访问器运算符- “[”和“]”完成的。在这种情况下,重要的是如何声明此函数以及从何处引用它。
如果它是全局声明的(即在全局范围内,作为函数声明或函数表达式),或在某个时刻分配给全局对象的属性,则可以将其作为全局对象的属性访问。在第 3。ECMAScript-262 版本,可以使用如下表达式访问全局对象:
(function(){ return this; })();
// or just `this` when in global scope
(请注意,在浏览器中, Global Object 通常与 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'];