Почему эта немедленно вызываемая функция может видеть добавку от последнего вызова?

#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 , вы получаете новое закрытие.