当我将其名称作为字符串时如何执行JavaScript函数
我有一个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);
}
这个问题的答案告诉你如何做到这一点:Javascript的Python等价于当地人()?
基本上,你可以说
window["foo"](arg1, arg2);
或者像其他许多人所建议的那样,您可以使用eval:
eval(fname)(arg1, arg2);
虽然这是非常不安全的,除非你完全确定你在评估什么。
链接地址: http://www.djcxy.com/p/2771.html上一篇: How to execute a JavaScript function when I have its name as a string
下一篇: How to replace master branch in git, entirely, from another branch?