html 中js 加載機制
1. 一般情況下,如果遇到js, 會堵塞html渲染,等到js 加載完畢並且執行完畢才會繼續渲染html,如果不要這種效果,script 提供了defer 和anysc兩種方式
defer: js下載和渲染html 同時執行,html渲染完成后,才執行js代碼
async: js下載和渲染html同時執行,js下載完成后,立即執行js代碼,執行js代碼過程會堵塞html的渲染
js代碼運行分兩個階段
1.預編譯階段,
在這個階段進行變量的提升,將變量賦值為undefined;函數的聲明提升
2. js執行階段
js 分為同步任務和異步任務,先執行同步任務,在執行異步任務
異步任務又分為宏任務和微任務,先執行微任務在執行宏任務
宏任務:setTimeout() ajax回調 事件回調(鼠標鍵盤事件)
微任務:promise await process.nextTick(node中的)
流程圖:
js中的內存泄露和垃圾回收
1.內存泄露: 不再用到的內存,沒有及時釋放,就會導致內存泄露 。
2. 導致內存泄露的幾種情況:
1)意外的全局變量 在函數中定義全局變量
2)被遺忘的計時器
3)濫用閉包,閉包中內部函數持有外部函數的變量,導致在閉包外可以引用閉包里面的變量
4)脫離 DOM 的引用 dom元素綁定了事件,在元素刪除后,事件還存在,導致的內存泄露
3.垃圾回收
1)最常用的是標記清除的方式,其次還有引用計數的方式
2)標記清除:從根節點遍歷,將可用的可達的做個標記,清除一些沒有標記的空間,被回收