#javascript #iife
#javascript #iife
Вопрос:
У меня создается впечатление, что каждый раз, когда вызывается функция, это новый экземпляр этой функции. Как получается, что этот код может принимать n и увеличивать его без того, чтобы n каждый раз возвращалось к нулю?
const f = (function()
{
let n = 0;
return function()
{
return n;
}
}());
console.log(f()); // prints 1
console.log(f()); // prints 2
console.log(f()); // prints 3
Комментарии:
1. Функция имеет доступ к переменной
n
в замыкании , созданном приf()
вызове. Закрытие сохраняется между вызовами функции.2. Это определяет замыкание : замыкание — это комбинация функции и лексической среды, в которой была объявлена эта функция .. Вы должны дать им чтение…
3. Функция, назначенная f , содержит в себе один оператор:
return n;
. Как вызов этой функции когда-либо вернет значение n обратно в 0?
Ответ №1:
IIFE выполняется только один раз, и значение присваивается f
. Итак, есть только одно замыкание, и у него есть один n
, который увеличивается при каждом вызове возвращаемой функции.
Результат, который вы ожидаете, произойдет, если вы напишете:
const f = function() {
let n = 0;
return function() {
return n;
}
};
console.log(f()()); // prints 1
console.log(f()()); // prints 1
console.log(f()()); // prints 1
Это не использует IIFE, это просто обычная функция более высокого порядка. Каждый раз, когда вы вызываете f
, вы получаете новое закрытие.