如果我們需要一個計數器,一個會把計數器設置成全局變量,這樣這個計數器會依次增加
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