我在 JavaScript 中有一个函数的名称作为字符串。如何将其转换为函数指针以便稍后调用?
根据情况,我可能还需要将各种参数传递到方法中。
某些功能可能采用 的形式namespace.namespace.function(args[...])
。
我在 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 语句中用上下文替换了它;否则,当执行目标函数时,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);
}
另一个问题的答案向您展示了如何做到这一点:Javascript 等效于 Python 的 locals()?
基本上,你可以说
window["foo"](arg1, arg2);
或者正如许多其他人所建议的那样,您可以只使用 eval:
eval(fname)(arg1, arg2);
尽管这是非常不安全的,除非您绝对确定要评估的内容。
我认为这样做的一种优雅方法是在哈希对象中定义您的函数。然后,您可以使用字符串从散列中引用这些函数。例如
var customObject = {
customFunction: function(param){...}
};
然后你可以调用:
customObject['customFunction'](param);
其中 customFunction 将是匹配对象中定义的函数的字符串。
更新
似乎这个答案对那里的许多编码人员很有帮助,所以这里有一个更新的版本。
使用 ES6,您还可以使用计算属性名称,这将允许您避免魔术字符串。
const FunctionNames = Object.freeze({
FirstFunction: "firstFunction",
SecondFunction: "secondFunction"
});
...
var customObject = {
[FunctionNames.FirstFunction]: function(param){...},
[FunctionNames.SecondFunction]: function(param){...}
};
...
customObject[FunctionNames.FirstFunction](param);
你能不能不这样做:
var codeToExecute = "My.Namespace.functionName()";
var tmpFunc = new Function(codeToExecute);
tmpFunc();
您还可以使用此方法执行任何其他 JavaScript。