首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在名称为字符串的情况下执行JavaScript函数

如何在名称为字符串的情况下执行JavaScript函数
EN

Stack Overflow用户
提问于 2008-12-11 15:47:11
回答 33查看 621.7K关注 0票数 1.2K

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

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

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

EN

回答 33

Stack Overflow用户

回答已采纳

发布于 2008-12-11 16:15:36

除非你绝对没有其他选择,否则不要使用eval

正如前面提到的,使用这样的东西将是最好的方法:

代码语言:javascript
运行
复制
window["functionName"](arguments);

然而,这将不适用于命名空间的函数:

代码语言:javascript
运行
复制
window["My.Namespace.functionName"](arguments); // fail

这就是你该怎么做的:

代码语言:javascript
运行
复制
window["My"]["Namespace"]["functionName"](arguments); // succeeds

为了简化这一过程并提供一定的灵活性,这里提供了一个方便的函数:

代码语言:javascript
运行
复制
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
运行
复制
executeFunctionByName("My.Namespace.functionName", window, arguments);

请注意,您可以在任何上下文中传递,因此这将与上面的操作相同:

代码语言:javascript
运行
复制
executeFunctionByName("Namespace.functionName", My, arguments);
票数 1.6K
EN

Stack Overflow用户

发布于 2010-12-04 10:16:47

我只是想发布一个稍微修改过的Jason Bunting's very helpful function版本。

首先,我通过向slice()提供第二个参数简化了第一条语句。最初的版本在除IE之外的所有浏览器中都运行良好。

其次,我在return语句中将其替换为context;否则,当执行目标函数时,它总是指向window。

代码语言:javascript
运行
复制
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);
}
票数 105
EN

Stack Overflow用户

发布于 2008-12-11 15:49:13

这个问题的答案向您展示了如何做到这一点:Javascript equivalent of Python's locals()?

基本上,你可以说

代码语言:javascript
运行
复制
window["foo"](arg1, arg2);

或者像其他许多人建议的那样,你可以直接使用eval:

代码语言:javascript
运行
复制
eval(fname)(arg1, arg2);

虽然这是非常不安全的,除非你绝对确定你在评估什么。

票数 76
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/359788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档