閉包,顧名思義就是一個封閉的包裹,你沒辦法窺探到其內(nèi)部,只能通過暴露給你的方法進(jìn)行操作。其實(shí)在寫代碼的過程中,我們可能已經(jīng)使用了閉包,只是當(dāng)時不知道而已。等理解了閉包,再去回顧以前的代碼,就會發(fā)現(xiàn)JavaScript中閉包無處不在。
剛開始學(xué)習(xí)閉包的時候,我看過很多關(guān)于閉包的文章,大部分都會舉例這樣一段代碼:
執(zhí)行函數(shù)Foo(),將函數(shù)內(nèi)部的方法bar作為返回值,賦值給變量fn,這樣在外部就可以直接訪問函數(shù)內(nèi)的變量。看下面這段代碼:
將內(nèi)部函數(shù)bar的引用傳遞給一個全局變量fn。
當(dāng)函數(shù)Foo()執(zhí)行完畢后,F(xiàn)oo()的內(nèi)容不會再被使用,根據(jù)javascript的垃圾回收機(jī)制,函數(shù)的內(nèi)存空間將會被回收,但是因?yàn)閎ar()在函數(shù)外部被執(zhí)行,而且bar可以訪問函數(shù)內(nèi)部的所有變量,所以函數(shù)的內(nèi)存空間不會被回收。
所以無論通過哪種方式將內(nèi)部函數(shù)傳遞到它所在的作用域之外,而它對于自身定義時的作用域始終有訪問的權(quán)限,這就形成了閉包,所以無論在什么地方執(zhí)行這個內(nèi)部函數(shù)都會用到閉包。
現(xiàn)在來說一下閉包與循環(huán):
很多人會以為這段代碼的輸出結(jié)果是:0 1 2 3 4,其實(shí)就算將代碼修改為setTimeout(....,0),結(jié)果也是:5 5 5 5 5。
因?yàn)檫@些回調(diào)函數(shù)是在循環(huán)結(jié)束之后才開始執(zhí)行,而他們共享全局作用域中的變量i,所以在它們執(zhí)行的時候所訪問到的i=5;對這段代碼進(jìn)行修改:
使用立即執(zhí)行函數(shù)創(chuàng)建一個獨(dú)立的作用域,并將作用域封閉在每一個回調(diào)函數(shù)中,使其擁有正確的變量i的引用。
閉包與模塊:
這種模式在javascript中被稱為模塊,Person是一個函數(shù),通過調(diào)用它來創(chuàng)建內(nèi)部作用域和閉包,它返回的是一個對象(不一定要返回對象,也可以只返回內(nèi)部方法),該對象被賦值給全局變量p,對象中的值是對函數(shù)內(nèi)部方法的引用。通過p可以訪問函數(shù)內(nèi)部的數(shù)據(jù)變量和方法。
參考資料:
1.YOU DON"T KNOW JS,KYLE SIMPSON
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87069.html
摘要:上圖中,每個紅圈表示一個請求,每一層的請求分別是上一層請求的子請求。換而言之,父請求是依賴于子請求的。特別地,的子請求運(yùn)行時,會阻塞父請求掛起其對應(yīng)的協(xié)程。 張超:又拍云系統(tǒng)開發(fā)高級工程師,負(fù)責(zé)又拍云 CDN 平臺相關(guān)組件的更新及維護(hù)。Github ID: tokers,活躍于 OpenResty 社區(qū)和 Nginx 郵件列表等開源社區(qū),專注于服務(wù)端技術(shù)的研究;曾為 ngx_lua 貢...
摘要:接下來就來說下我眼中的。鏈表轉(zhuǎn)換為樹的閾值,超過這個長度的鏈表會被轉(zhuǎn)換為紅黑樹,當(dāng)然,不止這一個條件,在下面的源碼部分會看到。 源碼部分從HashMap說起是因?yàn)楣P者看了很多遍這個類的源碼部分,同時感覺網(wǎng)上很多都是粗略的介紹,有些可能還不正確,最后只能自己看源碼來驗(yàn)證理解,寫下這篇文章一方面是為了促使自己能深入,另一方面也是給一些新人一些指導(dǎo),不求有功,但求無過。有錯誤的地方請在評論中...
摘要:前言函數(shù)式編程在前端已經(jīng)成為了一個非常熱門的話題。整個過程就是體現(xiàn)了函數(shù)式編程的核心思想通過函數(shù)對數(shù)據(jù)進(jìn)行轉(zhuǎn)換。高階函數(shù)函數(shù)式編程傾向于復(fù)用一組通用的函數(shù)功能來處理數(shù)據(jù),它通過使用高階函數(shù)來實(shí)現(xiàn)。 前言 函數(shù)式編程在前端已經(jīng)成為了一個非常熱門的話題。在最近幾年里,我們看到非常多的應(yīng)用程序代碼庫里大量使用著函數(shù)式編程思想。 本文將略去那些晦澀難懂的概念介紹,重點(diǎn)展示在 JavaScrip...
摘要:出品滴滴技術(shù)作者陶文技術(shù)同學(xué)的主要工作是構(gòu)建一個可運(yùn)行的去解決用戶的一個。陶文滴滴首席工程師在滴滴參與過基礎(chǔ)架構(gòu),核心出行平臺重構(gòu),業(yè)務(wù)中臺建設(shè)等工作,目前在從事平臺治理和客服系統(tǒng),致力于減少大家出行中遇到的不美好。 出品 | 滴滴技術(shù)作者 | 陶文 showImg(https://segmentfault.com/img/bVbs78V?w=1280&h=544); 技術(shù)同學(xué)的主要工...
閱讀 808·2021-10-14 09:43
閱讀 2133·2021-09-30 09:48
閱讀 3456·2021-09-08 09:45
閱讀 1103·2021-09-02 15:41
閱讀 1898·2021-08-26 14:15
閱讀 786·2021-08-03 14:04
閱讀 2985·2019-08-30 15:56
閱讀 3081·2019-08-30 15:52