Я работал над этой проблемой, так как мне нужна была такая функция. Вот мой код песочницы, не полностью протестированный, но может стать отправной точкой для других. Обратите внимание, что в коде есть один eval(), поскольку я не мог понять, как обойти этот шаг, возможно, причуду javascript и не может быть выполнен каким-либо другим способом. Дайте мне знать, есть ли способ избавиться от eval() здесь!
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');
возможно дубликат [Как выполнить JavaScript, когда у меня есть его имя как строка] (http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a- строка) – olibre