js之閉包和作用域鏈及垃圾回收講解

小白要努力i發表於2020-10-01

閉包:

概念:閉包就是能夠讀取其他函式內部變數的函式。
(有權訪問另一個函式作用域中的變數的函式。)
(就是拿到本不該屬於他的東西)

作用:閉包可以用在許多地方。它的最大用處有兩個,一個是可以讀取函式內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。

注意:由於閉包會使得函式中的變數都被儲存在記憶體中,記憶體消耗很大,所以不能濫用閉包,否則會造成網頁的效能問題,在IE中可能導致記憶體洩露。

作用域鏈

概念:在一個函式中巢狀多個函式,並且各自定義的相同的變數名,當函式訪問變數時,就形成了作用域鏈。

查詢順序:從當前函式開始查詢,如果沒有找到,向上一級函式開始查詢,直到找到為止,如果一直沒有找到,則說明該變數未定義。

小結;作用域鏈明確表示:在變數解析過程中首先查詢區域性作用域,然後查詢上層作用域	

垃圾回收

有兩種策略來實現垃圾回收:標記清除 和 引用計數;

標記清除:垃圾收集器在執行的時候會給儲存在記憶體中的所有變數都加上標記,然後,它會去掉環境中的變數的標記和被環境中的變數引用的
變數的標記,此後,如果變數再被標記則表示此變數準備被刪除。 2008年為止,IE,Firefox,opera,chrome,Safari的javascript都
用使用了該方式;

引用計數:跟蹤記錄每個值被引用的次數,當宣告一個變數並將一個引用型別的值賦給該變數時,這個值的引用次數就是1,如果這個值再被賦值
給另一個變數,則引用次數加1。相反,如果一個變數脫離了該值的引用,則該值引用次數減1,當次數為0時,就會等待垃圾收集器的回收

相關文章