[JS的垃圾回收機制和閉包|青训营笔记]

84 阅读2分钟

今天繼續對JS中的部分面試常用的知識進行一個學習和總結,有關JS的垃圾回收機製和閉包的相關概念我的掌握還是比較欠缺,需要再下多點功夫。

在項目中,如果有大量不被釋放的內存,例如堆、棧、上下文,將會拖累項目的運行速度。如果這些代碼又不能被合理釋放,還會造成內存洩漏,因此要減少閉包,因為閉包會消耗內存。

因此瀏覽器的JS有自動垃圾回收裝置(GC:Garbage Collecation),他會週期性找出沒有在使用的變量,然後釋放內存。

在JS中,最常用的垃圾回收機製是標記清除:當變量進入執行環境時,被標記為“進入環境”,當變量離開執行環境時,會標記為“離開環境”。垃圾會自動取銷毀那些帶標記的值並回收他們所佔用的內存空間。

在JS中,常見的內存洩漏有四種,分別是全局變量、閉包、DOM元素的引用、定時器。

閉包有兩個作用,一是保存,二是保護。函數在執行時形成的四有上下文(FN),在正常的情況下,代碼執行完之後會出棧釋放。但如果在這個私有上下文被佔用了,那他則不會被釋放。

保護的作用是,這個區域中有自己的私有變量存儲空間,保護自己的私有變量不受外界干擾,也就是說自己的私有變量和外界沒有關係。

保存的作用是,如果當前上下文沒有被釋放,則存儲的這些變量也不會被釋放,可以供其下級上下文中去調取使用,相當於我能夠把值存儲起來。

因此我們把函數執行中形成私有上下文,來保護和保存私有變量的機制來叫做閉包。

在紅寶書中,閉包的解釋是指有權有權訪問領一個函數作用域中的變量的函數。