2011-07-30 100 views
-2

可能重複的時間返回值說明:
How do JavaScript closures work?爲什麼這個封閉在迭代

據我所知,至少1個以上的人有倒閉的是,它返回的最新的給定變量的值,除非你這樣做:

function f() { 
    var a = []; 
    var i; 

    for (i = 0; i < 3; i++) { 
     a[i] = (function (x) { 
      return function() { 
       return x; 
      } 
     })(i); 
    } 
    return a; 
} 
} 

有一點點很多事情我都需要解釋。

+2

請具體說明您的問題。你現在應該已經知道了。 – hugomg

+2

看起來你加了一個'}'太多了。 – pimvdb

+0

看看這個問題,瞭解如何在JavaScript中關閉工作的一個很好的解釋http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

回答

1

在JavaScript中,變量的作用域始終是function(或全局對象)。所以,如果你做類似

for (var i = 0; i < 3; i++) { 
    a[i] = function (x) { 
     return i; 
    }; 
} 

只有一個i參與。在for循環完成後,i的值是2,無論調用哪個函數a[i]

要解決這個問題,我們需要建立一個新的範圍。通常,這是通過調用像這樣的匿名函數來完成:

a[i] = (function (x) { // (1) 
    return function() { // (2) 
     return x; 
    }; 
})(i); 

現在i在迭代時間被映射到新x一個品牌的每一次迭代,函數(1)確保它被「困」,直到執行a[i](2)。