我有多个基于站点部分命名空间的外部JavaScripts。我试图动态触发方法,但我无法触发方法。谁能告诉我这是什么问题?
如果我添加此方法,则会触发:
Namespace.Something.init()
但是当我尝试这样做时,没有任何反应(注意:命名空间等于Namespace.Something和functionname等于init):
namespace[functionname]();
答案 0 :(得分: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]();
由于Namespace是全局范围的一部分,您可以从[namespace]
访问它答案 1 :(得分:0)
基本上,您需要一次解析一个字符串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);
};
答案 2 :(得分:0)
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);