将变量作为属性返回到IIFE

时间:2017-01-09 07:07:54

标签: javascript iife

我试图在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则会更加清晰。

我已经尝试阅读JS闭包,但我们还没有获得任何有关私有变量没有正确引用的信息。

1 个答案:

答案 0 :(得分:4)

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

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

localInformation = _demoAPICall()

意味着您的InfoProp属性指向localInformation(空对象)的初始值,而在函数内,您获得最新值localInformation

您有两种选择:

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

extend(localInformation, _demoApiCall())

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

2)使用getter方法

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