實(shí)例
var add = (function () {
? ? var counter = 0;
? ? return function () {return counter += 1;}
})();
add();
add();
add();
// 計(jì)數(shù)器為 3
實(shí)例解析
變量 add 指定了函數(shù)自我調(diào)用的返回字值。
自我調(diào)用函數(shù)只執(zhí)行一次。設(shè)置計(jì)數(shù)器為 0驳棱。并返回函數(shù)表達(dá)式融柬。
add變量可以作為一個(gè)函數(shù)使用薄疚。非常棒的部分是它可以訪問(wèn)函數(shù)上一層作用域的計(jì)數(shù)器保檐。
這個(gè)叫作 JavaScript 閉包筛峭。它使得函數(shù)擁有私有變量變成可能瘾境。
計(jì)數(shù)器受匿名函數(shù)的作用域保護(hù)歧杏,只能通過(guò) add 方法修改。
閉包是可訪問(wèn)上一層函數(shù)作用域里變量的函數(shù)迷守,即便上一層函數(shù)已經(jīng)關(guān)閉犬绒。
我按我的理解總結(jié)下JavaScript閉包吧:
閉包就是一個(gè)函數(shù)引用另一個(gè)函數(shù)的變量,因?yàn)樽兞勘灰弥圆粫?huì)被回收兑凿,因此可以用來(lái)封裝一個(gè)私有變量凯力。這是優(yōu)點(diǎn)也是缺點(diǎn),不必要的閉包只會(huì)增加內(nèi)存消耗礼华。
或者說(shuō)閉包就是子函數(shù)可以使用父函數(shù)的局部變量咐鹤,還有父函數(shù)的參數(shù)。
JavaScript 變量可以是局部變量或全局變量圣絮。
私有變量可以用到閉包祈惶。