开发者

Dynamically firing a named-spaced method via JavaScript

I have multiple external JavaScripts that are namespaced based on the section of the site. I am trying开发者_JS百科 to dynamically fire methods, but am unable to get the methods to fire. Can anyone tell me what the problem is?

If I add this, the method fires:

Namespace.Something.init()

But when I try to do it like this, nothing happens (note: namespace equals Namespace.Something and functionname equals init):

namespace[functionname]();


Unless you want to use eval which I am sure you don't the following works.

This assumes that all your methods are the same level deep i.e 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]();  

as Namespace is part of the global scope you can access it from this[namespace]


I asked the same question a few weeks ago, though I think I phrased it slightly differently. See this.

Basically, you need to parse the string functionname one piece at a time.

By the way, using the walk_path code from that answer, here's a general purpose function I wrote to run a function from a string including arguments.

// 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);
};


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜