8

我想要的是将函数名作为字符串传递,就像我传递了对函数的引用一样。例如,我想做这个:

var test = function(fn){
  fn();
}
test(alert);

等于:

var test = function(function_as_string){
    //...code that converts function_as_string to function reference fn
    fn();
}
test('alert');

我怎样才能做到这一点?

4

5 回答 5

4

您从窗口对象获取函数引用:

var fn = window[function_as_string];

演示:http: //jsfiddle.net/Guffa/nA6gU/

于 2012-09-15T23:57:43.757 回答
2

使用 eval 获取对该函数的引用 -

var Namespace = {
    quack: function () {console.log('quack!')}
};

function test (fnName) {
    var fn = eval(fnName);
    fn();
}
test('Namespace.quack')

如果您愿意,这可能允许您传递其他参数。

哦,你可能无法简单地使用 window[fnName] 的原因是它是否像 $.ajax - window['$.ajax'] 会给你 undefined .. 所以除非你想创建一个复杂的函数要查找它是否在另一个命名空间中, eval 是您最好的选择。

于 2012-09-16T00:03:07.433 回答
1

看看这个eval()函数,它会让你提供一个被评估为 javascript 的字符串:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval

var test = function(fn){
  eval(fn + "()");
}
test(alert);

来自 MDN 的 eval 注释:

eval() 是一个危险的函数,它以调用者的权限执行它传递的代码。如果您使用可能受到恶意方影响的字符串运行 eval(),您最终可能会在具有网页/扩展程序权限的用户计算机上运行恶意代码。更重要的是,第三方代码可以看到 eval() 被调用的范围,这可能导致类似 Function 不易受到攻击的方式。

eval() 通常也比替代方法慢,因为它必须调用 JS 解释器,而许多其他构造由现代 JS 引擎优化。

对于常见的用例,有 eval() 的安全(且快速!)替代方案。

看这里:https ://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval

于 2012-09-15T23:58:06.847 回答
1

函数是对象的属性。您可以像访问任何属性一样访问它们,然后使用 () 来执行它们。

​var o = {};
​​​​
o.b = function b() {
    alert("b");
}

o.b();

o["b"]();

如果它是一个全局函数,那么它是窗口上的一个属性。

function a() {
    alert("a");
}

a();

window.a();

window["a"]();

就您的嵌套问题而言,最好的方法是将其作为属性分配给您以后可以访问的对象。例如:

function assignInside() {
    o.inside = function() {
        alert("inside");
    }
}

assignInside();
o["inside"]();

这一切都是jsfiddle

PS,在这种情况下没有理由使用 eval 并且有很多充分的理由来避免 eval 。

于 2012-09-16T00:02:50.740 回答
0

关于什么:

var fn = new Function(function_as_string)
于 2012-09-16T00:19:38.807 回答