带闭合和IIFE的JavaScript计数器

时间:2016-10-17 16:33:06

标签: javascript closures counter iife

在www.w3schools.com/js/js_function_closures.asp上有一个关闭计数器的基本示例,据我所知,IIFE:

c=2

然而,经过几个小时的阅读范围,关闭和IIFE,而不是第一次,并查看其他简单的例子,我仍然不明白为什么var add = (function () { var counter = 0; console.log(counter); return function () {return counter += 1;} })(); add(); add(); add(); // the counter is now 3 行只执行一次。我在该行之后添加的控制台日志从未输出任何内容,就像它永远不会被调用一样。

为什么每次调用add()时计数器都不会重置为0?我理解错误的概念是什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

  

我仍然不明白为什么var counter = 0;线是唯一的   执行一次。

因为IIFE函数只被调用一次。 add()调用执行此函数:

function () {return counter += 1;}

从IIFE返回。您可以通过给出函数名称并检查正在执行的函数的名称来检查它:

var add = (function iife() {
    var counter = 0;
    console.log(counter);
    return function inner() {return counter += 1;}
})();

add.name; // `inner`, not `iife`
  

我在该行之后添加的控制台日志从未输出任何内容,   好像永远不会被称为

它不可能。它应该输出0一次。

答案 1 :(得分:0)

Javascript引擎的第一步(在声明add之后)是初始化add,这导致调用IIFE,这又导致:

var add = function () {

    return counter = counter++
}

因为IIFE将此函数作为要分配给add的值返回。分配给add的函数仍然可以访问IIFE的词法范围(var counter):即闭包。

每个add()都是从IIFE返回的函数的调用,因此var counter = 0仅被调用一次(在初始化add时)。