Javascript 混淆加法算子逻辑

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

为什么变量计数器在自调用函数中将自身重新初始化回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;
}