为什么此立即调用功能能够从上次调用中看到错误?

时间:2019-04-10 04:39:05

标签: 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 个答案:

答案 0 :(得分:0)

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时,您都会得到一个新的闭包。