Динамический запуск именованного метода через JavaScript - PullRequest
1 голос
/ 29 марта 2011

У меня есть несколько внешних JavaScripts, которые имеют пространство имен в зависимости от раздела сайта. Я пытаюсь динамически запускать методы, но не могу запустить методы. Может кто-нибудь сказать мне, в чем проблема?

Если я добавлю это, метод сработает:

Namespace.Something.init()

Но когда я пытаюсь сделать это так, ничего не происходит (примечание: пространство имен равно Namespace.Something и functionname равно init):

namespace[functionname]();

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Если вы не хотите использовать eval, который, я уверен, вам не подойдет, следующие действия.

Это предполагает, что все ваши методы имеют один и тот же уровень глубины, т.е. namespace.somename.somemethod

var Namespace = {
  Something: {
    init: function() {
      console.log('init called');
    }
  }
};

Namespace.Something.init();

var namespace = "Namespace";
var section = "Something";
var method = "init";

this[namespace][section][method]();  

, поскольку Пространство имен является частью глобальной области, к которой вы можете получить доступ из этого [пространства имен]

0 голосов
/ 29 марта 2011
var methodName = 'Namespace.Something.init';
var methodParts = methodName.split('.');
var method = this;
for (var i=0; i < methodParts.length; i++) {
  method = method[methodParts[i]];
};
method(the arguments you want);
0 голосов
/ 29 марта 2011

Я задавал тот же вопрос несколько недель назад, хотя думаю, что сформулировал его немного по-другому.См. this.

По сути, вам нужно проанализировать строку functionname по одной части за раз.

Кстати, используя код walk_path из этогоответ, вот функция общего назначения, которую я написал для запуска функции из строки, включающей аргументы.

// run an arbitrary function from a string. Will attempt to parse the args from parenthesis, if none found, will
// use additional arguments passed to this function.
utils.runFunction = function (funcdef) {
    var argPos = funcdef.indexOf('(');
    var endArgPos = -1;
    var args = undefined;
    var func = funcdef;
    if (argPos > 0) {
        endArgPos = funcdef.indexOf(')', argPos);
        if (endArgPos > 0) {
            args = funcdef.substring(argPos + 1, endArgPos).split(',');
            func = funcdef.substring(0, argPos - 1);
        }
    } else {
        args = Array.prototype.slice.call(arguments, 1);
    }
    var func = walk_path(window, func);
    return !args ? func() : func.apply(null, args);
};
...