我已经为这个概念引用了多个链接,但要将这个概念完全封装起来有点棘手。
我正在经历一个例子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"中来立即执行该函数;((";。