作用域閉包的理解

都說閉包是javaScript中一個近乎神話的概念乡革,我剛好碰到這個神話泣刹,想著怎么把它講成一個故事煌抒!javaScript中閉包無處不在的,我們要做的是識別和擁抱它装悲。

閉包到底是什么昏鹃?

當函數可以記住并訪問所在的詞法作用域(不論函數是否在當前的詞法作用域內執(zhí)行),就產生了閉包诀诊。當然洞渤,這是官話,學術語氣太強了理解起來很難受属瓣,所以我用自己的理解+接地氣的語言來詮釋一下這句話载迄,我覺得在此同時,我們可以將閉包的缺陷一起了解一下抡蛙。下面我們來看兩段代碼:


1.常規(guī)操作
2.寫成閉包

這里的兩段代碼執(zhí)行的都是將原有的a變量重新賦值并打印出來护昧,我們先來看(當函數可以記住并訪問所在的詞法作用域(不論函數是否在當前的詞法作用域內執(zhí)行),就產生了閉包這句話怎么理解溜畅,看圖2。

首先要明白极祸,產生閉包的先決條件是函數的嵌套使用慈格!

其次再來理解概念:函數 wn() 包含在 foo() 的內部,它的詞法作用域能訪問到 foo() 的內部作用域遥金,我們將 wn() 對象本身作為返回值返回給 foo()浴捆,foo() 執(zhí)行后,其返回值(也就是內部的 wn() 函數)賦值給了psc稿械,并調用執(zhí)行了 psc() ,實際上只是通過不同的標識符引用选泻,來調用了內部函數 wn()。到這里這些文字應該都比較好理解對吧!R趁小L莶丁!好的睜大眼睛看下面這句話很重要:函數 foo() 并不是自執(zhí)行函數窝撵,圖2代碼的執(zhí)行順序并不是從上往下依次執(zhí)行的這個也能理解的吧傀顾?!代碼是執(zhí)行到最后的 psc() 調用的時候才返回去找 psc 是什么碌奉,好的找到了 psc 是函數 foo() 的賦值短曾,然后再去找 foo() 是什么,找到 foo() 這個函數的時候才依次從上向下執(zhí)行內部的代碼赐劣。剛剛我們就分析過了嫉拐,圖2的代碼其實際上只是通過不同的標識符引用最終調用的是 wn() 函數,在這個過程中魁兼,wn() 即實現了調用輸出婉徘,而它的詞法作用域又保存完成整——這就是閉包的概念。


3.閉包

無論通過何種手段將內部函數(這里指的是 wn() )傳遞到所在的詞法作用域以外璃赡,它都會持有對原始定義的作用域的引用判哥,無論在何處執(zhí)行這個函數,都涉及到使用閉包這一概念碉考。

——另外塌计,圖1放上來的作用一直沒說,其作用就是用來對比圖2,3侯谁。瀏覽器的引擎有垃圾回收機制(想要了解原理的自行去谷歌)锌仅。圖1中當foo() 調用完成,該函數內部將全局變量 a 賦值成了 2墙贱,當我們可以拿到這個為 2 的 a 來用時热芹,事實上,這個 foo() 函數已經功成名就惨撇,這個時候伊脓,雖然代碼還是在我們寫的js文件中,但是對于瀏覽器來說魁衙,這個已經執(zhí)行過的 foo() 函數宣布退隱江湖报腔,也不再給它分配作用域空間了,foo() 的內容也不再被使用了剖淀,引擎默認這樣做的意義是釋放瀏覽器不再使用的內存空間纯蛾,這相當于是引擎的自動優(yōu)化功能。而?閉包纵隔,這個東西翻诉,一旦形成卻是能阻止引擎的這一默認事件的發(fā)生炮姨,因為閉包形成了自己穩(wěn)定完整的內部作用域,引擎已經拿它沒有辦法了(打不過碰煌,動不了它舒岸,這個還是跟引擎的工作原理有關系),這個穩(wěn)定的內部作用域將永久的提供給? wn() 函數使用拄查,所以拜 wn() 所聲明的位置所賜吁津,它將永久擁有并在任何時間使用這個涵蓋 foo() 內部的作用域《榉觯——這就是閉包的缺點碍脏,不能釋放不需要使用的作用域,如果一個項目中這樣的閉包使用很多的話稍算,對瀏覽器性能的消耗將大大提升典尾。emmmmmmmmmm

不知道這樣講的夠不夠清楚,還不夠通俗的話我emmmm.....絞盡奶汁再想想怎么解釋糊探?

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末钾埂,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子科平,更是在濱河造成了極大的恐慌褥紫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瞪慧,死亡現場離奇詭異髓考,居然都是意外死亡,警方通過查閱死者的電腦和手機弃酌,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門氨菇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妓湘,你說我怎么就攤上這事查蓉。” “怎么了榜贴?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵豌研,是天一觀的道長。 經常有香客問我唬党,道長鹃共,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任初嘹,我火速辦了婚禮及汉,結果婚禮上沮趣,老公的妹妹穿的比我還像新娘屯烦。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布驻龟。 她就那樣靜靜地躺著温眉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翁狐。 梳的紋絲不亂的頭發(fā)上类溢,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音露懒,去河邊找鬼闯冷。 笑死,一個胖子當著我的面吹牛懈词,可吹牛的內容都是我干的蛇耀。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼坎弯,長吁一口氣:“原來是場噩夢啊……” “哼纺涤!你這毒婦竟也來了?” 一聲冷哼從身側響起抠忘,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤撩炊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崎脉,有當地人在樹林里發(fā)現了一具尸體拧咳,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年荧嵌,在試婚紗的時候發(fā)現自己被綠了呛踊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡啦撮,死狀恐怖谭网,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情赃春,我是刑警寧澤愉择,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站织中,受9級特大地震影響锥涕,放射性物質發(fā)生泄漏。R本人自食惡果不足惜狭吼,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一层坠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刁笙,春花似錦破花、人聲如沸谦趣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前鹅。三九已至,卻和暖如春峭梳,著一層夾襖步出監(jiān)牢的瞬間舰绘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工葱椭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捂寿,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓孵运,卻偏偏與公主長得像者蠕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掐松,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容