JavaScript模块模式中的方括号表示法和范围
我一直在使用JavaScript中的模块模式,对范围和方括号表示法(SBN)有疑问JavaScript模块模式中的方括号表示法和范围,javascript,scope,module-pattern,square-bracket,Javascript,Scope,Module Pattern,Square Bracket,我一直在使用JavaScript中的模块模式,对范围和方括号表示法(SBN)有疑问 请考虑以下简单的例子。 (function (module) { function myMethod(text) { console.log(text); } module.init = function (name) { // here I want to do something like // eval(name)("hello
请考虑以下简单的例子。
(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
?您可以将所有方法放入一个对象中
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
}
};
据我所知,如果不使用
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");
通过这种方式,只能调用在“methods”对象中专门定义的方法。非常感谢,这实际上就是我所做的-尽管将方法包装到另一个对象中似乎很奇怪。要澄清的是,这仅仅是因为没有对匿名函数的引用,因此没有对象可以在其中查找“myMethod”?非常感谢,这就是我最终所做的-我可以简单地调用
myMethod()
,但不能通过SBN引用它,这真是令人费解…是的。这很奇怪。但这是javascript为您准备的:-D