JavaScript闭包在这个示例中是如何工作的?

JavaScript闭包在这个示例中是如何工作的?,javascript,closures,lexical-scope,self-invoking-function,Javascript,Closures,Lexical Scope,Self Invoking Function,我对Javascript闭包概念比较陌生。 我知道如何完成工作,但我想彻底理解这个概念 有人能简单地解释一下,为什么示例1,2有效,而3,4无效? 任何关于js闭包的好链接都将受到赞赏 示例1 var add = (function() { var counter = 0; var plus = function() { return ++counter; }; return plus; })()

我对Javascript闭包概念比较陌生。 我知道如何完成工作,但我想彻底理解这个概念

有人能简单地解释一下,为什么示例1,2有效,而3,4无效? 任何关于js闭包的好链接都将受到赞赏

示例1

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

         return plus;

     })();

    console.log(add()); //1
    console.log(add()); //2
    console.log(add()); //3
示例2

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

add();//1
add();//2
add();//3
示例3

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

} 
 console.log(add());//1
 console.log(add());//1
 console.log(add());//1
示例4

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

return plus;
}


console.log(add()());//1
console.log(add()());//1
console.log(add()());//1

在示例3中,返回的
plus
不是函数,而是IIFE执行的结果,因此它是
1
。在示例4中,
add
函数每次都作为一个“新”函数执行(这是一个基本函数声明,因此每次都创建它的变量),因此计数器总是从
0
开始,最后变成
1
(实际上示例3也处于相同的情况)谢谢@CertainPerformance,kaddath-得到了我的答案