不要使用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);