如何使这个简单的 javascript 闭包工作

how to make this simple javascript closure work

我正在向这样的朋友解释 javascript 关闭:

function outer() {
    var count = 0;
    return (function(){
        count++;
        console.log(count);
    })();
}

我试图向他展示在执行外部函数时这个 'count' 变量是如何存储的。

所以我尝试在 javascript 控制台中执行此操作,并想向他展示当您在控制台中执行此操作时

outer(); // prints out 1
outer(); // calling again prints 2
outer(); // prints out 3

但实际上这件事发生了

outer(); // printed 1
outer(); // printed 1 again
outer(); // again 1 

我不明白这里出了什么问题。谁能指导一下。

因为你的count是在函数内部声明的,所以对函数作用域来说是"private",所以你的函数每次被调用时,变量count都会创建并初始化为 0 然后你的内部函数,也就是闭包递增它,这就是它打印 1 的原因,然后当你的闭包 returns 时,你的 count 变量是垃圾-collected 因为它的范围在那里结束——在匹配的大括号内,尝试将 count 移动到任何函数之外的最外层,然后你会得到你想要的,然后你的 count 将成为一个全局变量,它在生产代码中不好,因为你不想污染你的全局池,并产生内存泄漏问题。闭包基本上只是像 Java 中那样的内部函数。

您每次调用 outer() 时都设置了 count=0。如果你希望 count 是私有的,意思是在全局范围之外,那么我会使用这样的模块模式:

var counter = (function(c){
    var count = 0;

    c.outer = function(){
        count++;
        console.log(count);
    };
    return c;
}({} || counter))

counter.outer();

或者您可以简单地使用 outer() return 函数:

function outer() {
    var count = 0;
    return function(){
        count++;
        console.log(count);
    };
}

var myo = outer();
myo();
myo();
myo();

感谢@elclanrs。这是工作代码。

function outer() {
  var count = 0;
  return (function(){
    count++;
    console.log(count);
  });
}

现在当我调用这个函数并将它存储在一个变量中时

var myouter = outer();
myouter();
// 1
// undefined
myouter();
// 2
// undefined
myouter();
// 3
// undefined