閉包

1 閉包的含義

1.1MDN上對(duì)閉包的解釋

函數(shù)和對(duì)其周圍狀態(tài)(lexical environment,詞法環(huán)境)的引用捆綁在一起構(gòu)成閉包closure)。也就是說(shuō)车酣,閉包可以讓你從內(nèi)部函數(shù)訪問(wèn)外部函數(shù)作用域外遇。在 JavaScript 中,每當(dāng)函數(shù)被創(chuàng)建女阀,就會(huì)在函數(shù)生成時(shí)生成閉包宅荤。

1.2我對(duì)閉包的理解

每個(gè)函數(shù)都是一個(gè)閉包屑迂,函數(shù)F()在其私有空間定義的變量在函數(shù)空間外是不可見(jiàn)的,由于F()是可以在全局空間中被調(diào)用的冯键,所以在函數(shù)中新定義并返回一個(gè)新的Inner()函數(shù)惹盼,用來(lái)返回F()的的私有變量,從而生成一個(gè)可以訪問(wèn)F()私有空間的新的全局函數(shù)惫确。

下面是一個(gè)簡(jiǎn)單的閉包的例子:

function F(param) {

? ? var N = function() {

? ? ? ? return param;

? ? }

? ? param++;

? ? return N;

}

>var inner = F(123)

>inner();

124

inner()返回的是遞增更新之后的值手报,由此可以看出,函數(shù)所綁定的是作用域本身改化,而不是一個(gè)值掩蛤。

2 常見(jiàn)的閉包錯(cuò)誤

2.1 錯(cuò)誤代碼

function F() {

? ? var arr = [], i;

? ? for (i = 0; i < 3; i++) {

? ? ? ? arr[i] = function () {

? ? ? ? ? ? return i;

????????};

????}

? ? return arr;

}

> var arr = F();

>arr[0] () ; ?>arr[1] () ;?>arr[2] () ;

3 3 3

這并不是我們想要的結(jié)果,因?yàn)槲覀冊(cè)谶@里創(chuàng)建了三個(gè)閉包所袁,它們都指向了一個(gè)共同的局部變量i盏档,但是閉包并不會(huì)記錄它們的值,它們所擁有的只是相關(guān)域在創(chuàng)建時(shí)的一個(gè)連接(即引用)燥爷。

2.2 正確代碼:

方法一:即時(shí)函數(shù)

function F() {

? ? var arr = [], i;

? ? for( i = 0; i < 3; i++) {

? ? ? ? arr[i] = (function (x) {

? ? ? ? ? ? return function () {

? ? ? ? ? ? ? ? return x;

? ? ? ? ? ? }

? ? ? ? }(i));

? ? }

? ? return arr;

}

在這里蜈亩,不再創(chuàng)建一個(gè)返回i的函數(shù)了,而是將i 傳遞給了另一個(gè)即時(shí)函數(shù)前翎,在該函數(shù)中稚配,i被賦值給了局部變量x,這樣一來(lái)港华,每次迭代中的x就會(huì)擁有各種不同的值了道川。

方法二:普通內(nèi)部函數(shù)

function F() {

? ? function binder(x) {

? ? ? ? return function() {

? ? ? ? ? ? return x;

? ? ? ? };

????}

????var arr = [], i ;

? ? for (i = 0; i < 3; i++) {

? ? ? ? arr[i] = binder(i);

? ? }

? ? return arr;

}

該方法是在每次迭代過(guò)程中,在中間函數(shù)內(nèi)將i的值本地化立宜。

3 閉包的應(yīng)用

3.1 getter與setter

假設(shè)現(xiàn)在有一個(gè)變量冒萄,表示某個(gè)特定區(qū)間內(nèi)的值,我們不想把它暴露給外部橙数,所以將它保護(hù)在相關(guān)函數(shù)的內(nèi)部尊流,然后引入兩個(gè)額外的函數(shù)——一個(gè)用于獲取變量值,另一個(gè)用于給變量重新賦值灯帮。

3.2 迭代器

function setup(x) {

? ? var i = 0;

? ? return function() {

? ? ? ? return x[i++];

? ? };

}

> var next = setup(['a','b','c']);

>next();

3.3回調(diào)

function changeSize(size){

????return function(){ document.body.style.fontSize = size + 'px'; };

}

var size12 = changeSize(12);

var size14 = changeSize(20);

document.getElementById('size-12').onclick = size12;

document.getElementById('size-20').onclick = size14;

作為一個(gè)回調(diào)(事件觸發(fā)時(shí)調(diào)用的函數(shù))綁定到事件崖技。

參考:JavaScript面向?qū)ο缶幊讨改希ǖ诙妫?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钟哥,隨后出現(xiàn)的幾起案子迎献,更是在濱河造成了極大的恐慌,老刑警劉巖腻贰,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吁恍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)践盼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門鸦采,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宾巍,“玉大人咕幻,你說(shuō)我怎么就攤上這事《ハ迹” “怎么了肄程?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)选浑。 經(jīng)常有香客問(wèn)我蓝厌,道長(zhǎng),這世上最難降的妖魔是什么古徒? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任拓提,我火速辦了婚禮,結(jié)果婚禮上隧膘,老公的妹妹穿的比我還像新娘代态。我一直安慰自己,他們只是感情好疹吃,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布蹦疑。 她就那樣靜靜地躺著,像睡著了一般萨驶。 火紅的嫁衣襯著肌膚如雪歉摧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天腔呜,我揣著相機(jī)與錄音叁温,去河邊找鬼。 笑死核畴,一個(gè)胖子當(dāng)著我的面吹牛膝但,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膛檀,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼锰镀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咖刃?” 一聲冷哼從身側(cè)響起泳炉,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚎杨,沒(méi)想到半個(gè)月后花鹅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枫浙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年刨肃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了古拴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡真友,死狀恐怖黄痪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情盔然,我是刑警寧澤桅打,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站愈案,受9級(jí)特大地震影響挺尾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜站绪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一遭铺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧恢准,春花似錦魂挂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至眯漩,卻和暖如春芹扭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赦抖。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工舱卡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人队萤。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓轮锥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親要尔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子舍杜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359