我一直在使用JavaScript中的模块模式,并对范围和方括号表示法(SBN)有疑问。
请考虑以下简单示例。
(function (module) {
function myMethod(text) {
console.log(text);
}
module.init = function (name) {
// here I want to do something like
// eval(name)("hello");
// using SBN, e.g.
..[name].call(this, "hello");
};
})(window.Module = window.Module || {});
Module.init("myMethod");
在init
函数中,是否可以使用SBN调用myMethod
?
答案 0 :(得分:3)
您可以将所有方法放入对象中。
function myMethod(text) {
console.log(text);
}
var methods = {myMethod: myMethod, ... };
module.init = function (name) {
// here I want to do something like
// eval(name)("hello");
// using square bracket notation.
if(methods.hasOwnProperty(name)){
methods[name].call(this, "hello");
}
else {
// some error that the method does not exist
}
};
答案 1 :(得分:1)
据我所知,如果不使用eval
,就无法做到这一点。
也就是说,通常更好的方法是调用允许的方法的白名单,如下所示:
(function(module) {
var methods = {
"myMethod":function(text) {
console.log(text);
}
};
module.init = function(name) {
methods[name].call(this,"hello");
};
})(window.Module = window.Module || {});
Module.init("myMethod");
通过这种方式,可以调用仅在