当我将JavaScript函数的名称作为字符串时,如何执行它
2022-08-29 22:04:40
我在JavaScript中有一个函数的名称作为字符串。如何将其转换为函数指针,以便以后调用它?
根据具体情况,我可能还需要将各种参数传递到方法中。
某些函数可能采用 .namespace.namespace.function(args[...])
我在JavaScript中有一个函数的名称作为字符串。如何将其转换为函数指针,以便以后调用它?
根据具体情况,我可能还需要将各种参数传递到方法中。
某些函数可能采用 .namespace.namespace.function(args[...])
不要使用,除非你绝对,积极没有其他选择。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非常有用的功能版本。
首先,我通过向 slice() 提供第二个参数来简化第一个语句。原始版本在除IE之外的所有浏览器中都工作正常。
其次,我在 return 语句中用上下文替换了它;否则,在执行目标函数时,它始终指向窗口。
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);
}