摘要:前言上篇闖關(guān)模式作用域鏈和閉包中任務(wù)四閉包閉包在中是很重要的概念,他們讓出色地完成異步任務(wù)。所以說,作用域,作用域鏈,閉包,垃圾回收機制,他們都是息息相關(guān)的你的任務(wù)你需要用的來檢驗垃圾回收機制的運行。
前言
上篇 【闖關(guān)模式】作用域、鏈和閉包 中
任務(wù)四 閉包(Closures)閉包在JS中是很重要的概念,他們讓JS出色地完成異步任務(wù)。
為了能更好的理解閉包,我們先來看作用域鏈的例子:
someFunc() ↑ | inner() ↑ | foo()
我們稱someFunc()聲明了一個變量bar:
someFunc() var bar ↑ ?
有了嵌套作用域的知識,我們可以說inner()有權(quán)訪問bar:
someFunc() var bar ↑ | inner() alert(bar) ↑ ?
inner() 可以說 包住了 bar. 所以 inner() 是一個 閉包 .
為了回調(diào)式的編程,即使inner()不立即執(zhí)行,閉包也會保持。在JS中將inner傳來傳去,或者稍后在someFunc()中返回出來也是可以的,而在這個過程中,bar將一直是可用的。
你的任務(wù)修改之前的代碼,設(shè)置zip()中的bar = true,然后在foo()中將zip return出來。
完成后, 執(zhí)行scope-chains-closures verify
在JS中,內(nèi)存是被運行時環(huán)境(runtime)自動管理的。運行時環(huán)境決定了已用內(nèi)存的釋放。而這個決策過程就稱之為 垃圾回收機制
每一個JS運行環(huán)境都有自己的垃圾回收機制的算法,但是大多數(shù)用的都類似:標(biāo)記&清除算法,這個算法的原理即:
只標(biāo)記活動代碼中可達(dá)的內(nèi)存的引用(變量,函數(shù)等),任何引用只要沒有被標(biāo)記,就會被垃圾回收掉(即該塊內(nèi)存被釋放掉)
而這個標(biāo)記可達(dá)內(nèi)存的概念也一定程度上和閉包有關(guān):
someFunc() var bar return inner ↑ | inner() alert(bar) ↑ ?
當(dāng)閉包inner()被someFunc()return掉,它仍然保持了對bar的引用,這時標(biāo)記&清除算法就會標(biāo)記bar可達(dá),因此bar也就不會被垃圾回收掉。
對inner()來說,為了能正確解析對bar的引用,不僅需要保持存放bar的這塊內(nèi)存,而且需要保持可以訪問到bar的這條作用域鏈。
一旦對inner()的引用不再需要,就可以對其進(jìn)行垃圾回收了,這也意味著bar也可以被垃圾回收,最終整條作用域鏈都被回收掉,內(nèi)存被釋放。
所以說,作用域,作用域鏈,閉包,垃圾回收機制,他們都是息息相關(guān)的!
你的任務(wù)你需要用Chrome的DevTools來檢驗垃圾回收機制的運行。按以下的步驟來感受一下垃圾回收:
1) 在Chrome中開一個tab
2) 打開DevTools > Timeline tab
3) 確保設(shè)置和下圖一致:
a) 取消選中 Frames View (allows seeing memory graphs)
b) 選中 Flame Chart View (allows seeing where execution time is spent)
c) 選項中只選擇 "Memory"
4) 點擊灰色圓形按鈕開始搜集數(shù)據(jù)
5) 隨便訪問一個網(wǎng)站http://www.baidu.com
6) 點擊紅色的錄制按鈕停止搜集數(shù)據(jù)
7) 然后你家能看到類似下圖:
8) 我們要關(guān)注的是內(nèi)存突然減少的地方:
9) 選擇這部分突然減少的內(nèi)存
10) 看那個叫"GC Event"的黃色部分:
11) 然后就能看到回收的總內(nèi)存量和耗時
有趣的事情是,GC的耗時:一般遠(yuǎn)遠(yuǎn)超過16ms(這個能保持60fps的最大值)。同時當(dāng)GC發(fā)生時會阻塞主線程,所以如果你的程序很卡,就可能是大量GC惹的禍。
Note: 你如果有強迫癥,也可以繼續(xù)運行 scope-chain-closures verify
完翻譯倉促,如有錯誤歡迎指出!點贊更好哦~
附錄闖關(guān)項目地址
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/79137.html
摘要:前言這個系列是翻譯自中的直接闖關(guān)作用域鏈和閉包作用域,作用域鏈,閉包和垃圾回收機制都有一個共同點學(xué)了就忘閉包到底是干啥的啥時候發(fā)生垃圾回收機制作用域鏈到底是啥這個教程讓你發(fā)現(xiàn)這些都是小意思。 前言 這個系列是翻譯自 nodeschool.io中的 scope-chains-closures 直接闖關(guān): npm install -g scope-chains-closures scope...
摘要:前言上篇闖關(guān)模式作用域鏈和閉包上任務(wù)三全局作用域和變量遮蔽全局作用域理解作用域鏈在哪結(jié)束很重要所有的運行時環(huán)境都必須隱式創(chuàng)建一個全局作用域?qū)ο鬄g覽器中是,中是,這個對象就位于作用域鏈的頂端在任務(wù)一中,我們忽略了一個細(xì)節(jié),即當(dāng)不使用或者等定義 前言 上篇:【闖關(guān)模式】作用域、鏈和閉包 上 任務(wù)三 Global Scope & Shadowing 全局作用域和變量遮蔽 全局作用域(Glob...
摘要:對象數(shù)組初始化表達(dá)式,闖關(guān)記之上文檔對象模型是針對和文檔的一個。闖關(guān)記之?dāng)?shù)組數(shù)組是值的有序集合。數(shù)組是動態(tài)的,根闖關(guān)記之語法的語法大量借鑒了及其他類語言如和的語法。 《JavaScript 闖關(guān)記》之 DOM(下) Element 類型 除了 Document 類型之外,Element 類型就要算是 Web 編程中最常用的類型了。Element 類型用于表現(xiàn) XML 或 HTML 元素...
摘要:作用域和閉包是最重要的概念之一,想要進(jìn)一步學(xué)習(xí),就必須理解作用域和閉包的工作原理。全局和局部作用域的關(guān)系在函數(shù)體內(nèi),局部變量的優(yōu)先級高于同名的全局變量。作用域鏈的用途,是保證對執(zhí)行環(huán)境有權(quán)訪問的所有變量和函數(shù)的有序訪問。 作用域和閉包是 JavaScript 最重要的概念之一,想要進(jìn)一步學(xué)習(xí) JavaScript,就必須理解 JavaScript 作用域和閉包的工作原理。 作用域 任何...
摘要:在此例中,在匿名函數(shù)被返回后,它的作用域鏈初始化為包含函數(shù)的活動對象和全局變量對象。函數(shù)在執(zhí)行完畢后,其活動對象也不會被銷毀,因為匿名函數(shù)的作用域鏈仍然在引用這個活動對象,結(jié)果就是只是的執(zhí)行環(huán)境的作用域鏈會被銷毀,其活動對象會留在內(nèi)存中。 寫在前面 注:這個系列是本人對js知識的一些梳理,其中不少內(nèi)容來自書籍:Javascript高級程序設(shè)計第三版和JavaScript權(quán)威指南第六版,...
閱讀 2176·2023-04-26 00:41
閱讀 1221·2021-09-24 10:34
閱讀 3637·2021-09-23 11:21
閱讀 4489·2021-09-22 15:06
閱讀 1609·2019-08-30 15:55
閱讀 940·2019-08-30 15:54
閱讀 1890·2019-08-30 15:48
閱讀 617·2019-08-29 13:58