鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ 關(guān)于js中閉包 私有變量計數(shù)器的問題

關(guān)于js中閉包 私有變量計數(shù)器的問題

在第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>
回答
編輯回答
清夢

明白函數(shù)調(diào)用嗎?

function f() {
   return 1;
}

alert(f())

c = f()

alert(c)

道理是一樣的,c是函數(shù)的結(jié)果。

具體到你的代碼,count也是個函數(shù),只是它有個閉包,所以每次調(diào)用結(jié)果不一樣。

2018年4月21日 23:00
編輯回答
深記你

老哥啊,一個是函數(shù)調(diào)用,一個是固定值啊。
var c=count();這是賦值語句,c就固定不變了。
count();這是直接調(diào)用,每次調(diào)用都重新計算,返回的自然不一樣。
基礎(chǔ)不扎實啊。

2017年2月14日 08:03
編輯回答
涼薄

首先,要理解閉包的概念,你可以網(wǎng)上搜一下,總之可以簡單點的定義為:定義在一個函數(shù)內(nèi)部的函數(shù)

所以,你的bb函數(shù)就是一個閉包。

由于閉包中的變量是駐留在內(nèi)存中,不會隨著函數(shù)執(zhí)行完畢而銷毀。

你的變量a是不會被銷毀的。

所以你每次調(diào)用count()都會使得變量a累加。你一共調(diào)用了5次,a累加到了5。

當(dāng)你 “var c = count();” 的時候,其實是把第五次調(diào)用count函數(shù)的返回值賦值給了變量c。

之后你輸出了三次變量c,當(dāng)然結(jié)果(第五次調(diào)用count函數(shù)的返回值)都是5了。

2017年12月31日 09:44