閉包的理解

大名鼎鼎的閉包簇秒!面試必問溯泣。

請(qǐng)用自己的話簡(jiǎn)述

1.什么是「閉包」瞬女。

2.「閉包」的作用是什么窍帝。

首先來簡(jiǎn)述什么是閉包


假設(shè)上面三行代碼在一個(gè)立即執(zhí)行函數(shù)中(為簡(jiǎn)明起見,我就不寫立即執(zhí)行函數(shù)了诽偷,影響讀者理解)坤学。

評(píng)論里沒看完就說我寫得有問題的,請(qǐng)看清楚哦:

上面三行代碼在一個(gè)立即執(zhí)行函數(shù)中报慕。

三行代碼中深浮,有一個(gè)局部變量 local,有一個(gè)函數(shù) foo眠冈,foo 里面可以訪問到 local 變量飞苇。

好了這就是一個(gè)閉包:

「函數(shù)」和「函數(shù)內(nèi)部能訪問到的變量」(也叫環(huán)境)的總和,就是一個(gè)閉包蜗顽。

就這么簡(jiǎn)單布卡。

有的同學(xué)就疑惑了,閉包這么簡(jiǎn)單么雇盖?

「我聽說閉包是需要函數(shù)套函數(shù)忿等,然后 return 一個(gè)函數(shù)的呀!」

比如這樣:


這里面確實(shí)有閉包崔挖,local 變量和 bar 函數(shù)就組成了一個(gè)閉包(Closure)贸街。

為什么要函數(shù)套函數(shù)呢?

是因?yàn)樾枰植孔兞坷晗啵圆虐?local 放在一個(gè)函數(shù)里匾浪,如果不把 local 放在一個(gè)函數(shù)里,local 就是一個(gè)全局變量了卷哩,達(dá)不到使用閉包的目的——隱藏變量(等會(huì)會(huì)講)蛋辈。

這也是為什么我上面要說「運(yùn)行在一個(gè)立即執(zhí)行函數(shù)中」。

有些人看到「閉包」這個(gè)名字将谊,就一定覺得要用什么包起來才行冷溶。其實(shí)這是翻譯問題,閉包的原文是 Closure尊浓,跟「包」沒有任何關(guān)系逞频。

所以函數(shù)套函數(shù)只是為了造出一個(gè)局部變量,跟閉包無關(guān)栋齿。

為什么要 return bar 呢苗胀?

因?yàn)槿绻?return襟诸,你就無法使用這個(gè)閉包。把 return bar 改成 window.bar = bar 也是一樣的基协,只要讓外面可以訪問到這個(gè) bar 函數(shù)就行了歌亲。

所以 return bar 只是為了 bar 能被使用,也跟閉包無關(guān)澜驮。

閉包的作用

閉包常常用來「間接訪問一個(gè)變量」陷揪。換句話說,「隱藏一個(gè)變量」杂穷。

假設(shè)我們?cè)谧鲆粋€(gè)游戲悍缠,在寫其中關(guān)于「還剩幾條命」的代碼。

如果不用閉包耐量,你可以直接用一個(gè)全局變量:


這樣看起來很不妥飞蚓。萬一不小心把這個(gè)值改成 -1 了怎么辦。所以我們不能讓別人「直接訪問」這個(gè)變量廊蜒。怎么辦呢玷坠?

用局部變量。

但是用局部變量別人又訪問不到劲藐,怎么辦呢八堡?

暴露一個(gè)訪問器(函數(shù)),讓別人可以「間接訪問」聘芜。

代碼如下:


簡(jiǎn)明起見兄渺,我用了中文 :)

那么在其他的 JS 文件,就可以使用 window.獎(jiǎng)勵(lì)一條命() 來漲命汰现,使用 window.死一條命() 來讓角色掉一條命挂谍。

看到閉包在哪了嗎?


閉包到底是什么瞎饲?


第一句是變量聲明口叙,第二句是函數(shù)聲明,第三句是 console.log嗅战。

每一句我都學(xué)過妄田,為什么合起來我就看不出來是閉包?

我告訴你答案驮捍,你根本不需要知道閉包這個(gè)概念疟呐,一樣可以使用閉包!

閉包是 JS 函數(shù)作用域的副產(chǎn)品东且。

換句話說启具,正是由于 JS 的函數(shù)內(nèi)部可以使用函數(shù)外部的變量,所以這段代碼正好符合了閉包的定義珊泳。而不是 JS 故意要使用閉包鲁冯。

很多編程語言也支持閉包拷沸,另外有一些語言則不支持閉包。

只要你懂了 JS 的作用域薯演,你自然而然就懂了閉包撞芍,即使你不知道那就是閉包!

所謂閉包的作用

閉包會(huì)造成內(nèi)存泄露涣仿?

錯(cuò)。

說這話的人根本不知道什么是內(nèi)存泄露示惊。內(nèi)存泄露是指你用不到(訪問不到)的變量好港,依然占居著內(nèi)存空間,不能被再次利用起來米罚。

閉包里面的變量明明就是我們需要的變量(lives)钧汹,憑什么說是內(nèi)存泄露?

這個(gè)謠言是如何來的录择?

因?yàn)?IE拔莱。IE 有 bug,IE 在我們使用完閉包之后隘竭,依然回收不了閉包里面引用的變量塘秦。

這是 IE 的問題,不是閉包的問題动看。參見司徒正美的文章


轉(zhuǎn)載自https://segmentfault.com/a/1190000012785212

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尊剔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子菱皆,更是在濱河造成了極大的恐慌须误,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仇轻,死亡現(xiàn)場(chǎng)離奇詭異京痢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)篷店,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門祭椰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疲陕,你說我怎么就攤上這事吭产。” “怎么了鸭轮?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵臣淤,是天一觀的道長。 經(jīng)常有香客問我窃爷,道長邑蒋,這世上最難降的妖魔是什么姓蜂? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮医吊,結(jié)果婚禮上钱慢,老公的妹妹穿的比我還像新娘。我一直安慰自己卿堂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布草描。 她就那樣靜靜地躺著,像睡著了一般穗慕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逛绵,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天怀各,我揣著相機(jī)與錄音,去河邊找鬼术浪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胰苏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碟联,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼妓美,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了鲤孵?” 一聲冷哼從身側(cè)響起壶栋,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤普监,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后凯正,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毙玻,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廊散,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了运准。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幌氮。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胁澳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出韭畸,到底是詐尸還是另有隱情,我是刑警寧澤胰丁,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站隘马,受9級(jí)特大地震影響妻顶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讳嘱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望沥潭。 院中可真熱鬧匾南,春花似錦荞胡、人聲如沸喧锦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颜懊。三九已至,卻和暖如春河爹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咸这。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留媳维,地道東北人冰沙。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓执虹,卻偏偏與公主長得像拓挥,于是被迫代替她去往敵國和親袋励。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 閉包(closure)是Javascript語言的一個(gè)難點(diǎn)盖灸,也是它的特色,很多高級(jí)應(yīng)用都要依靠閉包實(shí)現(xiàn)磺芭。 一、變量...
    zouCode閱讀 1,271評(píng)論 0 13
  • 我不得不承認(rèn)我是一個(gè)幸運(yùn)兒放棒,我遇到的每一個(gè)人都是如此的優(yōu)秀姻报。在一群優(yōu)秀的人中間逐漸修煉我的性格间螟,完善我的技能 真的...
    KlivitamJ閱讀 405評(píng)論 0 1
  • 一、閉包的含義 官方對(duì)閉包的解釋:一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個(gè)函數(shù))加勤,因而這些變量也...
    sdcV閱讀 17,992評(píng)論 0 7
  • 閉包:從字面意思來理解就是封閉和包裹,換句話說鳄梅,就是在函數(shù)內(nèi)部定義的變量,在函數(shù)的外部無法訪問到戴尸,因此就說函數(shù)構(gòu)成...
    清葉閱讀 555評(píng)論 1 0
  • 接觸過JS的同學(xué)們一定都知道閉包這個(gè)名詞,在我剛開始學(xué)習(xí)JS的時(shí)候,閉包對(duì)于我是一個(gè)很高大上很難理解的存在悲雳,今天終...
    W北落師門W閱讀 266評(píng)論 0 1