了解在 JavaScript 的模块模式中命名返回对象的好处

Understanding the benefit of naming a returned object in the module pattern in JavaScript

我从文体上理解为什么要命名返回的对象,用于组织等。但是,我不明白添加或删除方法的好处或在运行时更新属性的能力。

var foo = (function(){
    var publicAPI = {
        bar: function(){
            publicAPI.baz();
        },
        baz: function(){
            console.log("baz");
        }
    };
    return publicAPI;
})();

我认为这是为了在出现错误时获得更好的调用堆栈。 例如,如果您将 console.log 更改为 console.blog 那么您将收到如下错误:

Uncaught TypeError: console.blog is not a function(…)
publicAPI.baz @ VM167:8
(anonymous function) @ VM241:2
...

这里你马上就看出问题出在publicAPI.baz.

通常,public api 可以访问闭包内的变量,并且是访问值的唯一方式。

你上面的例子是多余的,因为 api 只能访问返回的对象,但是如果你添加另一个只有 publicAPI 可以访问的变量,那么你就创建了隐私。

var foo = (function(){
    //private 
    var _foo = {name: 'Foo'};
    var publicAPI = {
        getName: function(){
            return _foo.name;
        },
        setName: function(name){
            _foo.name = name;
        },
    };
    return publicAPI;
})();