我想要的是将函数的名称作为字符串传递,并且就像我传递对函数的引用一样。例如,我想这样做:
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');
我该怎么做?
答案 0 :(得分:3)
答案 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)