Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量作为IIFE中的属性返回_Javascript_Iife - Fatal编程技术网

Javascript 将变量作为IIFE中的属性返回

Javascript 将变量作为IIFE中的属性返回,javascript,iife,Javascript,Iife,我试图在IIFE作为属性初始化之后返回一个变量集。问题是如果我直接绑定变量,就会得到一个空对象。如果我通过一个函数绑定它,我会得到我想要的结果 var应用程序=(函数(){ var localInformation={}; 函数init(){ localInformation=_demoApiCall(); } 函数_demoApiCall(){ //假设此方法不在此处,并返回一个复杂对象 返回{ 名称:“演示” } } 函数doWork(){ //如果调用localInformation,则

我试图在IIFE作为属性初始化之后返回一个变量集。问题是如果我直接绑定变量,就会得到一个空对象。如果我通过一个函数绑定它,我会得到我想要的结果

var应用程序=(函数(){
var localInformation={};
函数init(){
localInformation=_demoApiCall();
}
函数_demoApiCall(){
//假设此方法不在此处,并返回一个复杂对象
返回{
名称:“演示”
}
}
函数doWork(){
//如果调用localInformation,则此处的结构正确
}
返回{
Init:Init,
嫁妆:嫁妆,
InfoProp:localInformation,//返回{}
InfoMethod:function(){
return localInformation;//返回{name:“demo”}
}
}
})();
Application.Init();
console.log(Application.InfoProp);

log(Application.InfoMethod())
我猜您是想在返回的对象中写入
本地信息

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

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

您有两个选择:

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

extend(localInformation, _demoApiCall())
您可以使用jQuery的扩展,而不是lodash的扩展,或者任何其他实现都可以

2) 使用getter方法

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

我本来打算编写
localInformation
,但是我已经更新了我的示例,使其具有运行的代码。我从未在返回中看到过
get
关键字,如果它起作用,我肯定会使用它。你介意解释一下它的功能吗?它比它所暗示的更疯狂?MDN比我解释得更好:看起来你不能在引用名称之前使用
get
。如果我像这样使用它,它基本上对我有效:
上下文:{get Current(){return Current;}}
只是为了添加-如果将结果
\u demoApiCall()
分配给对象成员而不是整个对象,它不会创建第二个对象,它将使用与
函数init()相同的方法{localInformation.foo=_demoApiCall();}