Случай использования немедленного вызова функции: случайное совместное использование через замыкания
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
в этот конкретный момент.