关于js中闭包 私有变量计数器的问题

在第5次弹出之后 值不增加了
如果alert(count());方式弹出的话 会正常增加 +1
赋值给变量之后 var c = count();值就不变了
求大神指点

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript">
        var count = (function(){
            var a = 0;
            function bb(){
                a ++;
                return a;
            }
            return bb;
        })();

    alert(count());    //弹出1
    alert(count());    //弹出2
    alert(count());    //弹出3
    alert(count());    //弹出4

    var c = count();

    alert(c);    //弹出5
    alert(c);    //弹出5
    alert(c);    //弹出5
    

    </script>
</head>
<body>
    
</body>
</html>
阅读 3.2k
3 个回答

首先,要理解闭包的概念,你可以网上搜一下,总之可以简单点的定义为:定义在一个函数内部的函数

所以,你的bb函数就是一个闭包。

由于闭包中的变量是驻留在内存中,不会随着函数执行完毕而销毁。

你的变量a是不会被销毁的。

所以你每次调用count()都会使得变量a累加。你一共调用了5次,a累加到了5。

当你 “var c = count();” 的时候,其实是把第五次调用count函数的返回值赋值给了变量c。

之后你输出了三次变量c,当然结果(第五次调用count函数的返回值)都是5了。

明白函数调用吗?

function f() {
   return 1;
}

alert(f())

c = f()

alert(c)

道理是一样的,c是函数的结果。

具体到你的代码,count也是个函数,只是它有个闭包,所以每次调用结果不一样。

老哥啊,一个是函数调用,一个是固定值啊。
var c=count();这是赋值语句,c就固定不变了。
count();这是直接调用,每次调用都重新计算,返回的自然不一样。
基础不扎实啊。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题