JS关闭-重新初始化混乱



我已经为这个概念引用了多个链接,但要将这个概念完全封装起来有点棘手。

我正在经历一个例子https://www.w3schools.com/js/js_function_closures.asp

var add = (function () {
var counter = 0;
return function () {counter += 1; return counter}
})();
add();
add();
add(); //Counter is 3

但这不是每次被调用时计数器都被重新初始化为0吗?有人能用桌子或其他东西帮助我理解这里的每一步吗?

add所持有的是IIFE中的返回函数。(https://developer.mozilla.org/en-US/docs/Glossary/IIFE)

function () {counter += 1; return counter}

因此调用add不会重新初始化counter

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

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

在javascript中,函数有自己的执行环境。

执行环境在调用函数时创建,在执行完成时消失。

在上面的代码中;添加";成为执行IIFE函数后返回的新函数。

换句话说,IIFE函数的执行环境已经被执行并消失。

然而,内部返回函数仍在查看父函数的变量";计数器";。

以前有人说,当调用函数时,环境会消失。在这种情况下,记住父函数的环境被称为"闭包"。


IIFE是一个立即函数。

函数在必要时以"函数"的形式声明和调用;函数名称((;。

上面的IIFE将通过声明该函数并将其封装在"0"中来立即执行该函数;((";。

最新更新