欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談JavaScript暫時性死區(qū)與垃圾回收機制

 更新時間:2023年05月04日 14:17:48   作者:ronh  
本文主要介紹了淺談JavaScript暫時性死區(qū)與垃圾回收機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

暫時性死區(qū)(TDZ)

暫時性死區(qū)是什么

我們來看一個例子

 var tmp = 123;
 if (true) {      
     tmp = 'abc';     
     console.log(tmp);
     let tmp;  
 }

上面兩條語句都會報錯,因為初始化前無法訪問

但是我們知道var定義的變量,是存在變量提升的,我們來看一下其原理:

任何代碼運行前都會經歷預編譯階段,但它占用的時間往往極其短暫,所以我們一般感知不到,它主要是在內存中開辟一些空間以此來存放變量與函數。

預編譯時,js引擎創(chuàng)建執(zhí)行上下文,會將當前作用域中的變量和函數聲明提升到頂部

而暫時性死區(qū)是一種對于變量提升的限制

當一個變量被聲明時,在變量聲明前訪問該變量會拋出ReferenceError異常。這種行為稱為暫時性死區(qū)(TDZ,Temporal Dead Zone),存在于用let和const聲明的變量身上

本質上是由于變量聲明被提升,但是變量的賦值操作不會被提升,但是又不會像var一樣給一個默認的undefined,因此在變量聲明前訪問該變量會拋出異常,類似于C語言中使用沒有初始化的野指針,指針指向的堆或??臻g會暫時無法訪問

例如:

console.log(a);
let a;
//會報錯

js垃圾回收機制

內存泄漏

說到垃圾回收機制,我們首先要了解什么是內存泄漏

簡單來說,我們主機的內存空間是有限的,內存泄漏就是在運行程序時減少了我們可用的內存,一般有用的內存占用叫正常使用,而用過之后不需要留著的東西占著內存空間卻不釋放,就叫內存泄漏

在JavaScript中,內存泄漏通常是由于以下幾個原因導致的:

  • 全局變量:沒有使用var、let或const關鍵字聲明的變量會被自動添加到全局對象中,如果意外地創(chuàng)建了全局變量,可能會導致這些變量無法被垃圾回收器釋放。
  • 定時器或回調函數:在創(chuàng)建定時器或回調函數時,如果沒有及時清除它們,可能會導致它們一直占用內存空間,直到頁面關閉。
  • DOM節(jié)點引用:在操作DOM節(jié)點時,如果保存了節(jié)點的引用,但是沒有及時釋放引用,可能會導致節(jié)點一直占用內存空間,直到頁面關閉。
  • 閉包:在使用閉包時,如果閉包中引用了外部變量,但是沒有及時釋放閉包,可能會導致外部變量無法被垃圾回收器釋放。
  • 循環(huán)引用:在創(chuàng)建對象時,如果對象之間存在循環(huán)引用關系,可能會導致這些對象一直占用內存空間,直到頁面關閉。

垃圾回收機制

JavaScript垃圾回收機制就是使用自動內存管理技術,它會自動檢測哪些變量、對象和數據不再被使用,然后自動釋放它們所占用的內存空間

那么它是如何實現(xiàn)的呢?一般有以下兩種算法:

  • 引用計數,它的基本思路是為每個對象維護一個引用計數器,當一個對象被引用時,計數器加1,當對象不再被引用時,計數器減1,當計數器的值為0時,表示該對象不再被使用,可以被垃圾回收器釋放。引用計數算法可以快速地處理不再被引用的對象,但是它無法處理循環(huán)引用的情況,因此在實際應用中很少使用

  • 標記清除,它的基本思路是通過標記所有可以訪問到的對象,然后清除所有未被標記的對象。在JavaScript中,垃圾回收器會從全局對象開始遍歷內存中的所有對象,標記所有可以訪問到的對象,然后清除所有未被標記的對象。標記清除算法可以有效地處理循環(huán)引用的情況,但是它需要占用大量的時間和內存空間,因此在執(zhí)行過程中可能會出現(xiàn)性能問題。

基于此,v8引擎就對垃圾回收機制做了優(yōu)化

  • 首先是分代垃圾回收,將分為新生代老生代兩個區(qū)域,新生代中存儲的是生命周期較短的對象,而老生代中存儲的是生命周期較長的對象。新生代區(qū)域使用Scavenger算法,老生代區(qū)域使用Mark-Sweep(標記清除)和Mark-Compact(標記壓縮)即標記算法。
  • 其次是增量式垃圾回收,將整個垃圾回收的過程分為多個小步驟,在每個小步驟之間可以插入一些JavaScript代碼的執(zhí)行。這種方式可以避免垃圾回收造成的長時間的頁面卡頓。
  • 最后是標記壓縮Mark-Compact,由于標記清除Mark-Sweep會清除未標記的對象,導致只回收不連續(xù)的內存塊,這樣還有有很多內存塊碎片雖然被清除,仍無法使用。標記壓縮法就是,V8引擎在老生代區(qū)域中,對標記存活的對象進行遷移,再將移動后的存活對象的地址重新映射到新的位置,然后清除原地址內存塊,這樣可用內存塊就不會是碎片化,導致難以使用。但是移動對象的過程肯定也是影響性能的,不能過于頻繁。

再有就是在V8引擎中,垃圾回收的頻率是動態(tài)可變的,

  • V8引擎在啟動時設置的最大堆大小,一旦堆中的對象數量超過了閾值,V8引擎會立即啟動垃圾回收器。一般情況下,V8引擎是根據當前堆中的對象數量、內存使用情況、CPU占用率等來自動計算的垃圾回收間隔時間。
  • 除自動調節(jié)垃圾回收頻率外,還可以通過手動觸發(fā)垃圾回收來調節(jié)垃圾回收的頻率。如在js中使用window.gc()方法手動觸發(fā)垃圾回收。
  • 還可以在Node.js中可以通過--max-old-space-size參數來設置老生代堆內存的閾值大小,通過--max-new-space-size參數來設置新生代閾值的大小

到此這篇關于淺談JavaScript暫時性死區(qū)與垃圾回收機制的文章就介紹到這了,更多相關JavaScript暫時性死區(qū)與垃圾回收機制內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mint-UI時間組件起始時間問題及時間插件使用

    Mint-UI時間組件起始時間問題及時間插件使用

    這篇文章主要介紹了Mint-UI時間組件起始時間問題的解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • JavaScript中的垃圾回收與內存泄漏示例詳解

    JavaScript中的垃圾回收與內存泄漏示例詳解

    這篇文章主要給大家介紹了關于JavaScript中垃圾回收與內存泄漏的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用JavaScript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-05-05
  • 頁面間固定參數,通過cookie傳值的實現(xiàn)方法

    頁面間固定參數,通過cookie傳值的實現(xiàn)方法

    下面小編就為大家?guī)硪黄撁骈g固定參數,通過cookie傳值的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • JS數字抽獎游戲實現(xiàn)方法

    JS數字抽獎游戲實現(xiàn)方法

    這篇文章主要介紹了JS數字抽獎游戲實現(xiàn)方法,可實現(xiàn)按下回車鍵出現(xiàn)隨機數字切換的效果,涉及時間與隨機數的相關操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • 深入淺析JavaScript中的Function類型

    深入淺析JavaScript中的Function類型

    Function是javascript里最常用的一個概念,javascript里的function是最容易入手的一個功能,但它也是javascript最難理解最難掌握的一個概念。這篇文章主要介紹了JavaScript中的Function類型的相關資料,一起看下吧
    2016-07-07
  • 使用JS解析excel文件的完整實現(xiàn)步驟

    使用JS解析excel文件的完整實現(xiàn)步驟

    解析excel文件是我們日常開發(fā)中經常遇到的一個需求,下面這篇文章主要給大家介紹了關于使用JS解析excel文件的完整實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-10-10
  • 微信小程序中使用wxss加載圖片并實現(xiàn)動畫效果

    微信小程序中使用wxss加載圖片并實現(xiàn)動畫效果

    記錄微信小程序中使用wxss加載圖片并實現(xiàn)動畫的方式,最終實現(xiàn)loading效果。本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • 禁止JS運行的代碼

    禁止JS運行的代碼

    如果我們要讓頁面上的javascript不運行,方法最簡單的就是使用noscript標簽,經常被用來屏蔽那些免費空間要加上的JS。
    2011-01-01
  • webpack 3.X學習之多頁面打包的方法

    webpack 3.X學習之多頁面打包的方法

    這篇文章主要介紹了webpack 3.X學習之多頁面打包的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • JavaScript基礎之this和箭頭函數詳析

    JavaScript基礎之this和箭頭函數詳析

    這篇文章主要給大家介紹了關于JavaScript基礎之this和箭頭函數的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用JavaScript具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09

最新評論