2012-02-15 50 views
2

對於以下代碼,輸出爲12 12。JavaScript理解某些關閉行爲

var omg = function(){ 

     var space = {q:12} ; 

     var sq = []; 

     sq[0] = function(){ 
       console.log(space.q); 
       space.q = 14; 
     }; 

     sq[1] = function(){ 
       console.log(space.q); 
     }; 



     return sq; 

}; 

omg()[0](); 
omg()[1](); 
~       

爲什麼輸出不是12 14?!?

回答

4

每個omg()調用返回一個新的功能。因此,omg()[0]()調用會更改該特定實例的本地值q。我想如果你這樣做:

var a = omg() 
a[0](); 
a[1](); 

你會得到預期的輸出。

+0

Nit:它返回一個新的數組,它有一個名稱爲兩個新函數的元素(屬性)(在它們創建的詞法範圍內「關閉」空間)... – 2012-02-15 06:37:59

+0

Duh,thank you for捕捉這一點。 – Prospero 2012-02-15 06:46:05

3

每個omg()生成一個單獨的封閉與一個單獨的space對象。

爲了讓您的預期行爲,需要調用omg()一次並使用相同的變量在它調用這兩個函數:

var arr = omg(); 
arr[0](); 
arr[1](); 
1

您執行omg()的兩倍,因此您可以通過單獨的space對象獲得兩個不同的關閉。