繁体   English   中英

如何使这个简单的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 

我不明白这里出了什么问题。 有人可以指导我。

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

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

现在,当我调用此函数并将其存储在变量中时

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

这是因为您的count是在函数内部声明的,因此它是函数范围的“私有”,因此每次调用函数时,都会创建变量count并将其初始化为0然后内部函数(也称为闭包)将其递增,这就是为什么它显示1 ,然后当您的闭包返回时,因为范围结束于此,所以您的count变量被垃圾回收了-在匹配的花括号内,尝试将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()返回一个函数:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM