如何使这个简单的JavaScript关闭工作

时间:2015-01-24 10:20:55

标签: javascript closures

我正在向这样的朋友解释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 

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

3 个答案:

答案 0 :(得分:2)

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

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

现在我调用此函数并将其存储在变量

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

每次拨打count=0时都会设置outer()。如果您希望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();