当我将JavaScript函数的名称作为字符串时,如何执行它

2022-08-29 22:04:40

我在JavaScript中有一个函数的名称作为字符串。如何将其转换为函数指针,以便以后调用它?

根据具体情况,我可能还需要将各种参数传递到方法中。

某些函数可能采用 .namespace.namespace.function(args[...])


答案 1

不要使用,除非你绝对,积极没有其他选择。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);

答案 2

我只是想发布一个稍微改变一下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);
}