JavaScript閉包是一種保護私有變量的機制,在函數(shù)執(zhí)行時形成私有的作用域,保護里面的私有變量不受外界干擾。就是形成一個不銷毀的棧環(huán)境。
如果你要設置一個計數(shù)器,代碼如下:
var counter = 0;
function add() {
return counter += 1;
}
add();
add();
add();
// 計數(shù)器現(xiàn)在為 3
但問題counter屬于全局變量,頁面上的其他腳本可以改變計數(shù)器。這樣我們把它變成局部變量。
function add(){
var counter = 1;
return counter += 1;
}
add();
add();
add();
這里輸出為1,并沒有累計數(shù)字。
這里需要閉包,代碼如下:
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
案例解析
這里的案例中變量 add 指定了函數(shù)自我調用的返回字值。
自我調用函數(shù)只執(zhí)行一次。設置計數(shù)器為 0。并返回函數(shù)表達式。
add變量可以作為一個函數(shù)使用。它可以訪問函數(shù)上一層作用域的計數(shù)器。
這個叫作 JavaScript 閉包。它使得函數(shù)擁有私有變量變成可能。
計數(shù)器受匿名函數(shù)的作用域保護,只能通過 add 方法修改。
注意事項
1、自調用函數(shù)外部的括號是必須的,如果沒有加上JavaScript無法解析為一個函數(shù)表達式的自調用;而是解析為一個函數(shù)的聲明和一個圓括號,并顯示語法錯誤——圓括號內沒有有效的表達式。
2、由于自調用函數(shù)是立即執(zhí)行函數(shù),其函數(shù)名稱會自動被忽略,不能使用函數(shù)名調用,所以自調用函數(shù)沒必要寫函數(shù)名。