Return 作为 IIFE 中的 属性 的变量

Return a variable as a property in an IIFE

我正在尝试 return 将 IIFE 初始化后的变量集设置为 属性。问题是如果我直接绑定变量,我会得到一个空对象。如果我通过函数绑定它,我会得到我想要的结果。

var Application = (function(){

    var localInformation = {};

    function init(){
        localInformation = _demoApiCall();
    }

    function _demoApiCall(){
        // Pretend this method isn't here, and returns a complex object
        return {
            name: "Demo"
        }
    }

    function doWork(){
        // localInformation is properly structured here if called
    }

    return {
        Init: init,
        DoWork: doWork,
        InfoProp: localInformation, // returns {}
        InfoMethod: function(){
            return localInformation; // returns {name:"demo"}
        }
    }

})();

Application.Init();

console.log(Application.InfoProp);
console.log(Application.InfoMethod());

在文档准备就绪时最初调用 Application.Init() 之后,该示例仅在我调用 var inf = Application.InfoMethod() 时才有效,但如果我可以调用 var info = Application.InfoProp.[=16,它会更清晰=]

我试图阅读 JS 闭包,但没有得到任何关于为什么没有对私有变量的正确引用的信息。

我猜你是想在返回的对象中写 localInformation

问题是您正在将 localInformation 变量名重新分配给新对象。

localInformation = _demoAPICall()

意味着你的 InfoProp 属性 指向 localInformation (空对象)的初始值,而在函数内,你得到 [=13= 的最新值].

您有两个选择:

1) 扩展现有对象而不是将变量名分配给新对象:

extend(localInformation, _demoApiCall())

您可以使用 jQuery 的扩展,而不是来自 lodash 的扩展,或者任何其他实现都可以。

2) 使用getter方法

return {
  Init: Init,
  get InfoProp () { return information },
  ....
}