为什么变量计数器在自调用函数中重新初始化为0时会继续增加?
var add = (function () {
var counter = 0;
return function () {
return counter += 1;
}
})();
add();
add();
add();
// the counter is still 3 when this line of code exists
// var counter = 0;
因此,当调用add()函数时,函数首先运行,初始化counter = 0并返回另一个函数,该函数返回计数器的增量值。为什么会出现 var counter = 0; ?
的情况来源:https://www.w3schools.com/js/js_function_closures.asp
编辑:2017年11月16日
好的,现在从这个页面上给出的两个答案中得到更多的理解。为了进一步澄清,我将添加自己的推理,以便更好地了解这种情况发生的原因。
//first call of add()
(function(){ // a self-invoking function
var counter = 0; // executes once with the self-invoking function
return function() { return counter += 1; } //explained below
});
//since the self-invoke function ran already, add() will begin to run the returned function:
add = function() { return counter += 1; };
add(); ----> counter += 1; -----> add.counter = 1;
//counter acts like this.counter, so it's a part of add()
//counter is now at 1
//second call of add();
//add has now officially been **transformed** to the new function:
add = function() {
return counter += 1;
};
//while add.counter still **exists** and remains in the self-invoke
//function. Do we call this **limbo variable** ? Don't know.
//add.counter is at 2
//third call of add();
function() {
return counter += 1;
}
//add.counter is at 3!
答案 0 :(得分:3)
请注意" var add"分配了一个自动调用函数,它返回一个函数。 无论返回语句如何,自调用函数闭包。这意味着它可用于返回的函数。 所以它实际上只是初始化一次。然后是return函数,这是变量"添加" now contains,在调用它时递增计数器。
答案 1 :(得分:2)
因为变量add
包含自调用函数的结果。所以add
的价值是这样的:
function () {
return counter += 1;
}
计数器变量仅在此函数设置为add
变量之前初始化。