开发者问题收集

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

2008-12-11
722354

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

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

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

3个回答

除非您 绝对、肯定 没有其他选择,否则不要使用 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
2008-12-11

我只是想发布一个略微修改过的 Jason Bunting 非常有用的函数

首先,我通过向 slice() 提供第二个参数简化了第一个语句。原始版本在除 IE 之外的所有浏览器中都能正常工作。

其次,我在 return 语句中将 this 替换为 context ;否则,在执行目标函数时, this 始终指向 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);
}
Alex Nazarov
2010-12-04

这个其他问题的答案向您展示了如何做到这一点: Javascript 相当于 Python 的 locals()?

基本上,您可以说

window["foo"](arg1, arg2);

或者像许多其他人建议的那样,您只需使用 eval:

eval(fname)(arg1, arg2);

尽管这非常不安全,除非您绝对确定您正在进行 eval。

Eli Courtwright
2008-12-11