Почему эта функция с немедленным вызовом способна увидеть результат последнего вызова? - PullRequest
0 голосов
/ 10 апреля 2019

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

0 голосов
/ 10 апреля 2019

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

...