JavaScript模块模式中的方括号表示法和作用域

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函数内部使用SBN调用myMethod是否可行?
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
    }
};

非常感谢,这就是我最终做的 - 真的很令人困惑,我可以简单地调用 myMethod() 但无法通过 SBN 引用它... - Fraser
1
是的,这很奇怪。但这就是 JavaScript 的特点 :-D - qwertynl

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

以这种方式,只有在“方法”对象中明确定义的方法才能被调用。

非常感谢,这实际上是我所做的-尽管将方法包装在另一个对象中似乎很奇怪。为了澄清,这只是因为没有对匿名函数的引用,因此没有对象来查找“myMethod”吗? - Fraser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接