Я думаю, что цикл добавляет путаницу по какой-то причине. Если вы развернете этот цикл, он, вероятно, станет более интуитивным.
function buildFunctions() {
var arr = [];
var i = 0;
arr.push(function() {
console.log(i)
})
i++;
arr.push(function() {
console.log(i)
})
i++;
arr.push(function() {
console.log(i)
})
i++;
return arr;
}
var fs = buildFunctions(); // [function(){console.log(1)}, ...and so on]
//not [function(){console.log(i)} ...and so on]
fs[0](); // outputs 3
fs[1](); // 3
fs[2](); // 3
Итак, вы можете видеть, что мы помещаем три функции в массив, а между ними мы увеличиваем i
. Вы также можете видеть, что все три функции «смотрят» на одну и ту же переменную i
.
Переменная не читается до тех пор, пока функция не будет вызвана , поэтому, поскольку все они "смотрят" на одну и ту же переменную, они, естественно, будут давать один и тот же результат при окончательном вызове. И поскольку i
был увеличен в три раза перед любым из вызовов , возвращаемое значение будет 3
.
В качестве упражнения измените каждую функцию, чтобы добавить еще i++
. Вы увидите, что они не только читают одну и ту же переменную, но все они могут видоизменить эту же переменную.