Não use a eval
menos que você absolutamente, positivamente , não tenha outra escolha.
Como já foi mencionado, usar algo como isso seria a melhor maneira de fazer isso:
window["functionName"](arguments);
Isso, no entanto, não funcionará com uma função de espaço para nome:
window["My.Namespace.functionName"](arguments); // fail
É assim que você faria isso:
window["My"]["Namespace"]["functionName"](arguments); // succeeds
Para tornar isso mais fácil e fornecer alguma flexibilidade, aqui está uma função de conveniência:
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);
}
Você poderia chamar assim:
executeFunctionByName("My.Namespace.functionName", window, arguments);
Observe que você pode passar no contexto que desejar, para fazer o mesmo que acima:
executeFunctionByName("Namespace.functionName", My, arguments);