在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?我理解错误的概念是什么?谢谢你的帮助。
答案 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
时)。