2017-01-09 129 views
3

我試圖返回一個變量設置後,作爲一個屬性的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關閉,但沒有得到任何信息,爲什麼沒有適當的引用私有變量。

回答

3

我想你打算在你的返回對象中寫入localInformation

問題是您正在將localInformation變量名稱重新分配給新對象。

localInformation = _demoAPICall() 

也就是說你InfoProp屬性指向的localInformation初始值(空物體),而函數中,你得到的localInformation最新值。

你有兩個選擇:

1)擴展而不是分配變量名到一個新的現有對象:

extend(localInformation, _demoApiCall()) 

你卡恩使用jQuery的延長,加班從lodash的一個,或任何其他的實現都可以。

2)使用一個getter方法

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

我的意思寫的'localInformation',但是我已經更新了我的例子有正在運行的代碼。我從來沒有在返回中看到過'get'關鍵字,如果它有效,它肯定會使用它。你介意解釋一下它是什麼,它比它表明的更瘋狂嗎? – TheGeekZn

+1

MDN解釋它比我所能做的更好:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get – lordvlad

+0

看起來你不能在參考名稱前面使用'get' 。它基本上適用於我,如果我像這樣使用它: '上下文:{get Current(){ return current; }}' – TheGeekZn

相關問題