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

How do I convert a string to a function reference in JavaScript?

本文关键字:转换 函数 引用 字符串 JavaScript      更新时间:2023-09-26

我想要的是将函数的名称作为字符串传递,并将其作为对该函数的引用传递。例如,我想做这个:

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

我该怎么做?

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

var fn = window[function_as_string];

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

函数是对象的属性。您可以像访问任何属性一样访问它们,然后使用()执行它们。
​var o = {};
​​​​
o.b = function b() {
    alert("b");
}
o.b();
o["b"]();

若它是一个全局函数,那个么它就是window上的一个属性。

function a() {
    alert("a");
}
a();
window.a();
window["a"]();

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

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

这一切都像小提琴一样。

PS,在这种情况下没有理由使用eval,而且有很多很好的理由可以避免eval。

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

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

如果你想的话,这可能会允许你传递其他参数

哦,你可能不能简单地使用window[fnName]的原因是,如果它是类似$.ajax的东西,window['$.ajax']会给你未定义的。。因此,除非你想创建一个复杂的函数来查找它是否在另一个命名空间中,否则eval是你的最佳选择。

看看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

关于:

var fn = new Function(function_as_string)