var i = 10;
var array = [];
while (i--) {
array.push(function() {
return i + i;
});
}
array.forEach(item => console.log(item())); // 10 раз напечатается -2
// после выхода из цикла i = -1; И так как i является "глобальной", то все функции будут "ссылаться" на одно и тоже значение после цикла
// array[function() { return i + i; }, function() { return i + i }, function() { return i + i }, ...]
// ==> array[function() { return -1 + -1 }, function() { return -2 }, ...]
// ==> array[0]() ==> return -2;
// ------------------------------------------------------
// Проблему можно решить так:
var i = 10;
var array = [];
while (i--) {
array.push((function(i) {
// Сохранить i в замыкании
return function() {
return i + i;
}
})(i));
}
array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0
// ------------------------------------------------------
// Или так
var i = 10;
var array = [];
while (i--) {
let value = i;
array.push(function() {
return value + value;
});
}
array.forEach(item => console.log(item())); // 18 16 14 12 10 8 6 4 2 0