JavaScript模块模式中的方括号表示法和范围

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

我一直在使用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

您可以将所有方法放入一个对象中

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