当我将其名称作为字符串时如何执行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?