2016-06-10 77 views
0

我試圖重現這裏的IIEF的例子循環:關閉在JavaScript中

Understand JavaScript Closures With Ease

編輯

這下3.閉包走了歪

這是我的代碼:

var myArray = ["a", "b", "c"]; 

function doSomething(someArray) { 
    var counter = 10; 
    for (var i = 0; i < someArray.length; i++) { 
    someArray[i] = function(inner_i) { 
     return function() { 
     return counter += inner_i; 
     }(); 
    }(i); 
    } 
    return someArray; 
} 

var newArray = doSomething(myArray); 
console.log(newArray[0]); 
console.log(newArray[1]); 
console.log(newArray[2]); 

輸出是

10 
11 
13 

,而不是

10 
11 
12 

我在做什麼不同?

+1

的inner_i是在你的第三環路2,這意味着:'計數器+ = inner_i'等於'11 + 2 = 13'只是'返回計數器+ inner_i' – KRONWALLED

+0

'返回計數器+ inner_i; ' –

+0

*「我做了什麼不同?」*我們怎麼知道?您沒有顯示您要比較代碼的代碼。 –

回答

3

結果沒有錯,因爲您在每次迭代中更新counter的值。相反,只需返回counteri的總和即可。

var myArray = ["a", "b", "c"]; 
 

 
function doSomething(someArray) { 
 
    var counter = 10; 
 
    for (var i = 0; i < someArray.length; i++) { 
 

 
    someArray[i] = function(inner_i) { 
 
     return function() { 
 
     return counter + inner_i; 
 
     }(); 
 
    }(i); 
 
    } 
 

 
    return someArray; 
 
} 
 

 
var newArray = doSomething(myArray); 
 
console.log(newArray[0]); 
 
console.log(newArray[1]); 
 
console.log(newArray[2]);

+1

該死的,一分鐘太遲。拿我的upvote :) –

+1

非常感謝!完全沒有看到! – NotSmartButLucky