我试图在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闭包,但我们还没有获得任何有关私有变量没有正确引用的信息。
答案 0 :(得分:4)
我想你的意思是在你返回的对象中写localInformation
。
问题是您正在将localInformation
变量名重新分配给新对象。
localInformation = _demoAPICall()
意味着您的InfoProp
属性指向localInformation
(空对象)的初始值,而在函数内,您获得最新值localInformation
。
您有两种选择:
1)扩展现有对象,而不是将变量名称分配给新对象:
extend(localInformation, _demoApiCall())
你可以使用jQuery的扩展,或者来自lodash的扩展,或任何其他实现都可以。
2)使用getter方法
return {
Init: Init,
get InfoProp () { return information },
....
}