在JavaScript中,我有一个字符串形式的函数名。如何将其转换为函数指针,以便稍后调用?
根据具体情况,我可能还需要向该方法传递各种参数。
其中一些函数可能采用namespace.namespace.function(args[...])的形式。
发布于 2008-12-11 16:15:36
除非你绝对没有其他选择,否则不要使用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);发布于 2010-12-04 10:16:47
我只是想发布一个稍微修改过的Jason Bunting's very helpful function版本。
首先,我通过向slice()提供第二个参数简化了第一条语句。最初的版本在除IE之外的所有浏览器中都运行良好。
其次,我在return语句中将其替换为context;否则,当执行目标函数时,它总是指向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);
}发布于 2008-12-11 15:49:13
这个问题的答案向您展示了如何做到这一点:Javascript equivalent of Python's locals()?
基本上,你可以说
window["foo"](arg1, arg2);或者像其他许多人建议的那样,你可以直接使用eval:
eval(fname)(arg1, arg2);虽然这是非常不安全的,除非你绝对确定你在评估什么。
https://stackoverflow.com/questions/359788
复制相似问题