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

时间:2014-01-02 17:35:04

标签: 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");
        // using SBN, e.g.
        ..[name].call(this, "hello"); 
    };

})(window.Module = window.Module || {});

Module.init("myMethod");

init函数中,是否可以使用SBN调用myMethod

2 个答案:

答案 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");

通过这种方式,可以调用仅在对象中明确定义的方法。