He trabajado en este problema, ya que necesitaba una función como esta. Aquí está mi código sandbox, no probado a fondo, pero puede ser un punto de partida para los demás. Tenga en cuenta que hay un eval() en el código, ya que no pude encontrar la manera de omitir ese paso, tal vez una peculiaridad de javascript y no se puede hacer de ninguna otra manera. ¡Avíseme si hay una manera de deshacerse de eval() aquí!
executeFunctionByName = function(functionName)
{
var args = Array.prototype.slice.call(arguments).splice(1);
//debug
console.log('args:', args);
var namespaces = functionName.split(".");
//debug
console.log('namespaces:', namespaces);
var func = namespaces.pop();
//debug
console.log('func:', func);
ns = namespaces.join('.');
//debug
console.log('namespace:', ns);
if(ns == '')
{
ns = 'window';
}
ns = eval(ns);
//debug
console.log('evaled namespace:', ns);
return ns[func].apply(ns, args);
}
core = {
paragraph: {
titlebar: {
user: "ddd",
getUser: function(name)
{
this.user = name;
return this.user;
}
}
}
}
var testf = function()
{
alert('dkdkdkd');
}
var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon');
executeFunctionByName('testf');
posible duplicado de [Cómo ejecutar una Función de JavaScript cuando tengo su nombre como una cadena] (http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a- cadena) – olibre