Closure

概念

直接來(lái)看兩個(gè)函數(shù)的對(duì)比

function count1() {
    var arr1 = [];
    for (var i=1; i<=3; i++) {
        arr1.push(i*i);
    }
    return arr1;
}
function count2() {
    var arr2 = [];
    for (var i=1; i<=3; i++) {
        arr2.push(function () {
            return i * i;
        });
    }
    return arr2;
}

執(zhí)行 count1()調(diào)用第一個(gè)函數(shù)加矛,很簡(jiǎn)單特咆。我們會(huì)得到 arr1 = [1, 4, 9]

那么第二個(gè)函數(shù)呢?它居然在 arr2.push() 中執(zhí)行了函數(shù)定義谒兄,也就是說(shuō)玖姑,當(dāng)我們調(diào)用 count2() 以后,arr2中將不會(huì)是三個(gè)數(shù)字液肌,而是三個(gè)函數(shù)挟炬。

我們得繼續(xù)調(diào)用 arr2 中的函數(shù)才能獲得結(jié)果。

已知執(zhí)行 count2() 得到 arr2嗦哆, 而 arr2 中都是函數(shù)方法谤祖,需要括號(hào)來(lái)執(zhí)行。

嘗試 count2()[0]()老速,居然得到結(jié)果為 16 粥喜!

這是為什么呢?梳理一下函數(shù)執(zhí)行的過(guò)程橘券。

  1. count2()執(zhí)行時(shí)额湘,定義 arr2 為空秕铛。
  2. 接著進(jìn)行 for 循環(huán)賦予 arr2三個(gè)函數(shù)。注意缩挑,就在這里發(fā)生了變化但两。由于這種閉包結(jié)構(gòu)的特殊性,i * i并不會(huì)立即執(zhí)行供置,因?yàn)樗鈱舆€包裹了一個(gè)函數(shù)定義嘛谨湘,你得調(diào)用函數(shù)才能得到結(jié)果。
  3. 隨著 for 循環(huán)的運(yùn)行芥丧,i * i1 * 1變化成 2 * 2紧阔,再變化...
  4. 等到 return arr2的時(shí)候,i 已經(jīng)為 4 了续担,arr2中已經(jīng)是三個(gè)返回 4 * 4的待執(zhí)行函數(shù)擅耽,當(dāng)你執(zhí)行以后,結(jié)果當(dāng)然都是 16 物遇。

這也就是說(shuō)乖仇,在閉包結(jié)構(gòu)下,引用這種變化量是很危險(xiǎn)的询兴。

如果一定要引用的話乃沙,需要傳入一個(gè)立即執(zhí)行的匿名函數(shù)。

function count() {
    var arr = [];
    for (var i=1; i<=3; i++) {
        arr.push((function (n) {
            return function () {
                return n * n;
            }
        })(i));
    }
    return arr;
}

也就是這一塊

(function(n) {
    return function() {
        return n * n;
    }
})(i);

匿名函數(shù)的語(yǔ)法是這樣的:(function (x) { return x * x }) (3);

作用域

當(dāng)利用了作用域以后诗舰,就可以在函數(shù)里封裝狀態(tài)了警儒。

function create_counter(initial) {
    var x = initial || 0;
    return {
        inc: function () {
            x += 1;
            return x;
        }
    }
}

inc 可以引用它上一級(jí)的 x 變量,而你從外部不能訪問(wèn)到這個(gè)變量 x 眶根。

學(xué)習(xí)資料

https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143449934543461c9d5dfeeb848f5b72bd012e1113d15000
里面還有個(gè)很變態(tài)的推導(dǎo)蜀铲,我并沒(méi)有去推...

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
另一篇通俗易懂的文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末属百,一起剝皮案震驚了整個(gè)濱河市记劝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诸老,老刑警劉巖隆夯,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異别伏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)忧额,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門厘肮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人睦番,你說(shuō)我怎么就攤上這事类茂∷J簦” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵巩检,是天一觀的道長(zhǎng)厚骗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)兢哭,這世上最難降的妖魔是什么领舰? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮迟螺,結(jié)果婚禮上冲秽,老公的妹妹穿的比我還像新娘。我一直安慰自己矩父,他們只是感情好锉桑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著窍株,像睡著了一般民轴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球订,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天杉武,我揣著相機(jī)與錄音,去河邊找鬼辙售。 笑死轻抱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旦部。 我是一名探鬼主播祈搜,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼士八!你這毒婦竟也來(lái)了容燕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤婚度,失蹤者是張志新(化名)和其女友劉穎蘸秘,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗茁,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡醋虏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了哮翘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颈嚼。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖饭寺,靈堂內(nèi)的尸體忽然破棺而出阻课,到底是詐尸還是另有隱情叫挟,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布限煞,位于F島的核電站抹恳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏署驻。R本人自食惡果不足惜奋献,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望硕舆。 院中可真熱鬧秽荞,春花似錦、人聲如沸抚官。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)凌节。三九已至钦听,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倍奢,已是汗流浹背朴上。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卒煞,地道東北人痪宰。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像畔裕,于是被迫代替她去往敵國(guó)和親衣撬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容