5

我一直在使用 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函数内部是否可以myMethod使用 SBN 调用?

4

2 回答 2

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
    }
};
于 2014-01-02T17:38:31.263 回答
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");

这样,只有在那个“方法”对象中明确定义的方法才能被调用。

于 2014-01-02T17:39:09.203 回答