用閉包實現計數器

如果我們需要一個計數器,一個會把計數器設置成全局變量,這樣這個計數器會依次增加

var counter = 0;

function add() {
   return counter += 1;
}

add();
add();
add();
//counter爲3

這樣執行過3次add()後,因爲counter是全局變量,所以此時counter爲3,實現了計數器的功能。但這樣有個問題就是,counter暴露了出來,其他函數或者動作也能改變它的值。如:

var counter = 0;

function add() {
   return counter += 1;
}

add();
add();
add();
//counter爲3

counter++;
//counter爲4

這樣的計數器是不安全也不符合要求的。但是如果在函數內設置counter,那麼每次調用的時候counter都會恢復成初始值。

function add() {
    var counter = 0;
    counter += 1;
}

add();//counter爲1
add();//counter爲1
add();//counter爲1

所以我們需要的是這麼一個變量,它在函數每次調用時不要重置,但是它存在於函數內部。
在 JavaScript 中,所有函數都能訪問它們上一層的作用域!所以在父函數內定義子函數,子函數能訪問父函數的變量!子函數就相當於閉包。如果這時候把計數器定義在父函數裏,然後子函數調用計數器,再在父函數外面執行子函數進行計數,那麼這個計數器只能通過這個嵌套函數訪問到,並且每次計數都不會重置(因爲我們執行的是子函數,只有執行父函數該計數器纔會重置)

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();//這裏var add已經是執行過後的函數了,var add=function(){..}

add();//執行匿名子函數
add(); 
add();

// 計數器爲 3
發佈了36 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章