2012-12-09 27 views
0

可能重複:
Javascript closure?的迭代函數的Javascript閉包定義

這可能已經問過,但...

如果我想要的功能

列表
var funs = [ 
    function(){ console.log(1); }, 
    function(){ console.log(2); }, 
    function(){ console.log(3); }, 
    function(){ console.log(4); }, 
    function(){ console.log(5); } ] 

這似乎是一個可以通過類似使其:

var funs = []; 
for(var i=1; i <= 5; i++){ 
    funs.push(function(){ console.log(i) }; 
} 

不工作,作爲變量i是必然的所有功能的單一變量,從而使

funs[0](); funs[1](); funs[2](); funs[3](); funs[4](); 

輸出

6 
6 
6 
6 
6 

1 
2 
3 
4 
5 

這不是我想要的輸出。我想我需要在創建函數時強制javascript綁定i的值副本,而不是使用i的引用關閉。我將如何做到這一點?

回答

3

最簡單的方法是通過功能通過自動執行功能的參數:

for(...) { 
    (function(i) { 
     // here you have a new i in every loop 
    })(i); 
} 
+0

使用閉包的工作,但我只想補充一點,現代的方式(JS> 1.8.5)做這是通過使用'bind' - 參見https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind –

+0

完美,謝謝。 – Lucas

+0

@DavidTitarenco:你的意思是'推(console.log.bind(console,i))'?當然,這比嵌套兩個函數更優雅。 – Bergi