当我将 JavaScript 函数的名称作为字符串时,如何执行该函数
2008-12-11
722354
我有一个 JavaScript 函数的名称,它是一个字符串。我如何将其转换为函数指针,以便稍后调用它?
根据具体情况,我可能还需要将各种参数传递给该方法。
某些函数可能采用
namespace.namespace.function(args[...])
的形式。
3个回答
除非您
绝对、肯定
没有其他选择,否则不要使用
eval
。
正如已经提到的,使用类似这样的方法将是最好的方法:
window["functionName"](arguments);
但是,这不适用于命名空间函数:
window["My.Namespace.functionName"](arguments); // fail
您可以这样做:
window["My"]["Namespace"]["functionName"](arguments); // succeeds
为了使其更容易并提供一些灵活性,这里有一个便利函数:
function executeFunctionByName(functionName, context /*, args */) {
var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
您可以这样调用它:
executeFunctionByName("My.Namespace.functionName", window, arguments);
请注意,您可以传入任何您想要的上下文,因此这将执行与上面相同的操作:
executeFunctionByName("Namespace.functionName", My, arguments);
Jason Bunting
2008-12-11
我只是想发布一个略微修改过的 Jason Bunting 非常有用的函数 。
首先,我通过向 slice() 提供第二个参数简化了第一个语句。原始版本在除 IE 之外的所有浏览器中都能正常工作。
其次,我在 return 语句中将 this 替换为 context ;否则,在执行目标函数时, this 始终指向 window 。
function executeFunctionByName(functionName, context /*, args */) {
var args = Array.prototype.slice.call(arguments, 2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for (var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
Alex Nazarov
2010-12-04
这个其他问题的答案向您展示了如何做到这一点: Javascript 相当于 Python 的 locals()?
基本上,您可以说
window["foo"](arg1, arg2);
或者像许多其他人建议的那样,您只需使用 eval:
eval(fname)(arg1, arg2);
尽管这非常不安全,除非您绝对确定您正在进行 eval。
Eli Courtwright
2008-12-11