【问题标题】:Why is this Immediately Invoked Function able to see the incerment from the last call?为什么这个立即调用的函数能够看到上次调用的增量?
【发布时间】:2019-04-10 04:39:04
【问题描述】:

我的印象是,每次调用一个函数时,它都是该函数的一个新实例。这段代码怎么能取 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

【问题讨论】:

  • 该函数可以访问在调用f() 时创建的闭包 中的变量n。闭包在函数调用之间持续存在。
  • 定义closure闭包是函数和声明该函数的词法环境的组合。。你应该给他们一个阅读...
  • 分配给 f 的函数中有一条语句:return ++n;。调用该函数如何将 n 设置回 0?

标签: javascript iife


【解决方案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 时,您都会收到一个新的闭包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多