【问题标题】:Clicks counter (through a closure) does not increment点击计数器(通过闭包)不会增加
【发布时间】:2015-02-16 18:29:43
【问题描述】:

看起来由于某种原因我的代码无法跟踪我正在递增的局部变量,并且它总是返回其初始值 0。

这是我在http://jsfiddle.net/ou2uxwn5/20/附近玩过的JSFiddle

var counter = function(){
var i = 0;
console.log(i);
return function(){
    i++;
    return i;
   };
};

不确定垃圾收集器是否会吃掉它,尽管行为与定义的 var 调用相同(我希望这会创建引用而不是将局部变量 i 扔到垃圾箱中)。

代码有什么问题,为什么?

【问题讨论】:

    标签: javascript closures


    【解决方案1】:

    您应该立即执行第一个函数以避免任何混淆。这将返回一个新函数并将其分配给 counter

    var counter = (function(){
        var i = 0;
        console.log(i);
        return function(){
            i++;
            return i;
        };
    })(); // logs 0 in the console
    

    counter() 的调用将增加 i 并返回它的值。

    console.log(counter()); // logs 1 in the console
    console.log(counter()); // logs 2 in the console
    

    我建议您阅读有关闭包的内容,以更好地了解它们的工作原理。这是good place to start

    【讨论】:

      【解决方案2】:

      问题解决了:

      1) 应该调用“calls()”而不是“counter()” 2) 将 console.log(i) 移到 return 语句中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-04
        • 2017-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多