Случай использования немедленного вызова функции: случайное совместное использование через замыкания

var result=[];
for(var i=0;i<5;i++){
result.push(function () {return i});
}
console.log(result[1]());  //5 not 1

Я думаю, что результат должен быть [0,1,2,3,4], и я не понимаю, почему значение должно быть 5. Как это работает? Я полностью сбит с толку.

1 ответ

Поскольку JavaScript не имеет области видимости блока, он имеет область действия функции. Здесь только один i переменная, и она существует для всей функции. Он изменяется от 0 до 1 и т. Д. До 5. Все замыкания ссылаются на одну и ту же переменную.

Вы можете исправить это, передав значение в немедленно вызванную функцию, которая возвращает другую функцию:

result.push((function (i) { return function() { return i; } }(i));

В этом случае вы передаете значение i во внешней функции, которая возвращает другую функцию, которая возвращает аргумент этой внутренней функции, эффективно захватывая значение внешней i в этот конкретный момент.

Другие вопросы по тегам