为什么不';t变量在闭包中重置(Javascript)

为什么不';t变量在闭包中重置(Javascript),javascript,scope,closures,self-invoking-function,Javascript,Scope,Closures,Self Invoking Function,我一直在努力学习闭包,但有一件事仍然困扰着我。如果我有以下代码: var add = (function () { var counter = 0; return function () {return counter += 1;} })(); add(); add(); add(); // Returns "3" 如果我调用add()三次,为什么不每次将计数器设置为零,然后返回将计数器递增1的匿名函数?自调用函数运行后是否跳过它?对不起,如果这个问题看起来很简单,我很难理

我一直在努力学习闭包,但有一件事仍然困扰着我。如果我有以下代码:

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

add();
add();
add();

// Returns "3"
如果我调用add()三次,为什么不每次将计数器设置为零,然后返回将计数器递增1的匿名函数?自调用函数运行后是否跳过它?对不起,如果这个问题看起来很简单,我很难理解。任何帮助都将不胜感激

如果我调用add()三次,为什么不每次将计数器设置为零,然后返回将计数器递增1的匿名函数

因为
add
是该匿名函数,因为包含
counter
的函数调用了,其结果被分配给
add

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
//^^----------- calls the outer function, returns the anonymous inner function
如果你没有叫它:

…然后,
add
将按照您所说的做,每次您调用它时,它将返回一个带有自己计数器的新函数:

var add=(函数(){
var计数器=0;
返回函数(){return counter+=1;}
});
var a=add();
var b=add();
var c=add();
log(“a的第一个调用:+a());
log(“a的第二个调用:+a());
log(“a的第三个调用:+a());
log(“b的第一个调用:+b());
log(“b的第二个调用:+b());
log(“b的第三个调用:+b());
log(“a的第四个调用:+a());
log(“b的第四个调用:+b())
。作为控制台包装器{
最大高度:100%!重要;

}
通过调用
add()
您实际上不是在执行外部函数,而是在执行内部函数。对于内部函数,计数器就像一个全局变量,它被设置为
0
,然后再也没有设置为
0
。调用
add()
时,您正在内部函数中执行行,从而增加计数器。

分配给
add
的值是创建闭包的IIFE的结果。当调用
add()
时,当它的创建编写如下(相当于您的原始代码)时,可能会发生更明显的情况:


添加
不是外部函数,声明
计数器
;这是内部函数,指的是
计数器
。仔细看看。只要
console.log(String(add))
你就会看到。该函数中没有
counter=0
。因此,我的代码只运行一次外部函数,将变量计数器设置为零,然后将add设置为递增计数器的函数?所以从技术上讲,它是从另一个函数引用变量计数器,这个函数是自调用的?@Mister_也许是的,正是这样。“从另一个范围引用变量”正是我们要讨论的,我现在明白了。非常感谢。
var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
});
//^--- no () here
var add;
(function () {
    var counter = 0;
    add = function () {return counter += 1;};
})();