2013-08-31 72 views
9

將參數傳遞給存儲在變量中的IIFE的正確語法是什麼?下面將參數傳遞給IIFE

例子告訴我,foo沒有定義,不管,如果我調用該函數或不:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(foo); 

console.log(bar.getFoo(1)); 

http://jsfiddle.net/eSTkL/

回答

20

的IIFE是立即調用。您在調用時將foo傳遞給它,並且我認爲它是未定義的。

存儲在bar中的內容不是IIFE,而是IIFE返回的對象,與foo沒有任何關係(除了通過閉包訪問它)。如果你想富成爲1,不要在價值傳遞給getFoo,但對IIFE本身:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(1); 

console.log(bar.getFoo()); // 1 

如果你想有一個getter和一個setter(實際上的getter/setter相似的功能),使用這個:

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     }, 
     setFoo: function(val) { 
      foo = val; 
     } 
    } 

})(1); 

console.log(bar.getFoo()); // 1 
bar.setFoo(2); 
console.log(bar.getFoo()); // 2 
+0

所以不可能像'bar(1)'做'foo === 1'這樣的事情嗎? – Johan

+0

你可以像創建一個getter一樣創建一個類似setter的方法。在該方法中,您可以將foo的值設置爲任何您傳遞的值。你是在試圖完成一些實際的事情,還是試圖理解它是如何工作的? – bfavaretto

+0

@Johan查看我的更新了setter代碼。 – bfavaretto

0

它是要傳遞到函數的foo

2

您傳遞給IIFE的foo未定義。您應該首先在外部變量環境中定義foo

var foo = "foobar"; 

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})(foo); 

,或直接在參數位置定義它。

var bar = (function(foo){ 

    return { 
     getFoo: function(){ 
      return foo; 
     } 
    } 

})("foobar"); 

另外請注意,你傳遞一個值getFoo(),但你沒有真正使用它的方法。

//   v----never gets used 
bar.getFoo(1)