通过JavaScript动态触发命名间隔方法

通过JavaScript动态触发命名间隔方法,javascript,javascript-events,methods,namespaces,Javascript,Javascript Events,Methods,Namespaces,我有多个外部Java脚本,它们是基于站点的部分命名的。我正在尝试动态激发方法,但无法激发方法。谁能告诉我是什么问题吗 如果添加此项,则该方法将激发: Namespace.Something.init() 但当我尝试这样做时,什么也没有发生(注意:namespace等于namespace.Something,functionname等于init): 几周前我问了同样的问题,不过我想我的措辞略有不同。看 基本上,您需要一次解析一个字符串functionname 顺便说一下,使用该答案中的walk\

我有多个外部Java脚本,它们是基于站点的部分命名的。我正在尝试动态激发方法,但无法激发方法。谁能告诉我是什么问题吗

如果添加此项,则该方法将激发:

Namespace.Something.init()
但当我尝试这样做时,什么也没有发生(注意:namespace等于namespace.Something,functionname等于init):


几周前我问了同样的问题,不过我想我的措辞略有不同。看

基本上,您需要一次解析一个字符串
functionname

顺便说一下,使用该答案中的
walk\u 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);
};

除非你想使用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]();  
由于名称空间是全局作用域的一部分,您可以从[Namespace]

var methodName='Namespace.Something.init'访问它;
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);
var methodParts=methodName.split('.'); var方法=此; 对于(var i=0;i
functionname===init
functionname====init'
?此[namespace][section]方法;不断抛出错误:“missing;before语句”。这是一个函数
this[namespace][section]方法()
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);