【问题标题】:Dynamically firing a named-spaced method via JavaScript通过 JavaScript 动态触发命名空间方法
【发布时间】:2011-07-25 11:58:18
【问题描述】:

我有多个基于站点部分命名的外部 JavaScript。我正在尝试动态触发方法,但无法触发这些方法。谁能告诉我是什么问题?

如果我添加这个,方法会触发:

Namespace.Something.init()

但是当我尝试这样做时,什么也没有发生(注意:命名空间等于 Namespace.Somethingfunctionname 等于 init):

namespace[functionname]();

【问题讨论】:

  • functionname===init 还是functionname==='init'

标签: javascript methods namespaces dom-events


【解决方案1】:
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);

【讨论】:

    【解决方案2】:

    除非您想使用 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]();  
    

    因为命名空间是全局范围的一部分,您可以从 this[namespace] 访问它

    【讨论】:

    • 这个[命名空间][节]方法;不断抛出错误:“缺少;之前的声明”。
    • 这是一个函数。 this[namespace][section]method();
    【解决方案3】:

    几周前我问过同样的问题,但我认为我的措辞略有不同。见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);
    };
    

    【讨论】:

      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2010-09-07
      • 2011-05-28
      相关资源
      最近更新 更多