如何在JavaScript中将字符串转换为函数引用?

时间:2012-09-15 23:51:38

标签: javascript string function reflection reference

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

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');

我该怎么做?

5 个答案:

答案 0 :(得分:3)

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

var fn = window[function_as_string];

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

答案 1 :(得分: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是您最好的选择。

答案 2 :(得分: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()通常也比替代品慢,因为它必须   调用JS解释器,同时优化许多其他构造   通过现代JS引擎。

     

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

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

答案 3 :(得分: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。

答案 4 :(得分:0)

怎么样:

var fn = new Function(function_as_string)