我想要的是将函数的名称作为字符串传递,就像我传递了对该函数的引用一样。例如,我想做这个:
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 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。
使用 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() 的范围,这可能导致可能的攻击 以类似的功能不受影响的方式。
eval() 通常也比替代方案慢,因为它必须 调用 JS 解释器,同时优化许多其他结构 通过现代 JS 引擎。
对于常见的情况,有安全(且快速!)的 eval() 替代方案 用例。
看这里:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/eval
关于:
var fn = new Function(function_as_string)
使用 Function Object
将字符串转换为函数const value = '(x, y) => x + y;';
const result = Function('return ' + value)();
console.log(result(1, 3)) // 3
立即调用 Function 对象将以函数的形式返回值