Javascript 混淆加法算子逻辑
为什么变量计数器在自调用函数中将自身重新初始化回0时不断增加Javascript 混淆加法算子逻辑,javascript,function,Javascript,Function,为什么变量计数器在自调用函数中将自身重新初始化回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
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函数时,一个函数首先运行,初始化计数器=0,然后返回另一个返回计数器增量值的函数。当var counter=0;,为什么会出现这种情况
资料来源:
编辑: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!
因为变量add包含自调用函数的结果。因此,add的价值是:
计数器变量仅在将此函数设置为add变量之前初始化。因为变量add包含自调用函数的结果。因此,add的价值是:
计数器变量仅在将此函数设置为add变量之前初始化。请注意,var add分配了一个返回函数的自调用函数。 return语句上方的任何内容都是自调用函数闭包。这意味着返回的函数可以使用它。
所以它实际上只初始化了一次。然后返回函数,即变量add现在包含的函数,在每次调用时递增计数器。请注意,var add分配了一个返回函数的自调用函数。 return语句上方的任何内容都是自调用函数闭包。这意味着返回的函数可以使用它。
所以它实际上只初始化了一次。然后,返回函数,即变量add现在包含的函数,在每次调用时都会递增计数器。看一看源代码的示例。但我们不是在添加后再次将其初始化回0吗?@RolandStarke我做了,但我仍然停留在这个注释上,自调用函数只运行一次,当add被调用3次,计数器的值变为3时,为什么自调用函数会运行一次?请看一看源代码的示例。但我们不是在添加后再次将其初始化回0吗?@RolandStarke我这样做了,但我仍然停留在这个注释上自调用函数只运行一次,当add被调用3次,计数器的值变为3时,为什么自调用函数只运行一次?哇,真的吗?!?!我从来不知道它会那样工作。哇哇。我将编辑我的原始问题和解释性答案,以供将来参考。谢谢你的额外澄清!哇,真的吗?!?!我从来不知道它会那样工作。哇哇。我将编辑我的原始问题和解释性答案,以供将来参考。谢谢你的额外澄清!感觉很奇怪,但我现在明白了。这就像柜台被困在某个地方,但它仍然在那里!哈。谢谢感觉很奇怪,但我现在明白了。这就像柜台被困在某个地方,但它仍然在那里!哈。谢谢
function () {
return counter += 1;
}