記憶體的生命週期:
1.配置記憶體空間:宣告值時完成配置
2.使用配置的記憶體空間
3.釋放不再用到的記憶體空間
JavaScript 的回收機制:當沒有任何物件參考它時,就會被視為可回收的記憶體。
看似簡單的 配置→使用→回收 這三個步驟
其中隱藏一些需要注意的要素
當我們離開懵懂初學階段往更高境界(提升效能)尋求時
對於記憶體的運作要更了解
查找網上資源時有提到:
記憶體流失(Memory leaks):疏忽或錯誤造成未能釋放已經不再使用的記憶體。
1.循環調用:幾個變數相互調用而導致無法回收。不需再用到時賦予 null
來解除引用
解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。
2.函式內沒有經過宣告而導致變成全域變數,以及盡量避免使用全域變數
3.計時器 & 回調函數 : 在 setInterval
setTiemout
沒有結束前,回調函數就無法被回收,
直到調用後才算結束,或是使用 clearInterval
clearTimeout
來清除。
單執行緒:一次只能執行一個任務 ( JavaScript 屬於此種)
多執行緒:可以執行多種任務
同步: 任務依序執行
非同步:setTimeout
、event
、AJAX
等的這種非同步行為則會先放到事件佇列,等到主要任務都跑完後才會開始執行
※為什麼要有非同步行為?假設今天要撈 AJAX 資料,我們就必須等資料撈完才能執行下段程式碼,畫面也許會因此停住,造成使用者體驗不佳。
JavaScript 在執行時,會先以同步概念執行主要程式碼,最後才會去執行非同步行為
範例1:試問執行順序
function eatBreakfast() {
console.log('吃早餐');
}
function washingPlate() {
console.log('洗餐盤');
}
function callSomeone(someone) {
console.log('打給' + someone)
setTimeout(function () {
console.log(someone + '回電');
}, 0);
}
function doWork() {
var auntie = '漂亮阿姨';
eatBreakfast();
callSomeone(auntie);
washingPlate();
}
doWork();
X
X
X
X
X
X
doWork()
→ eatBreakfast()
→ callSomeone(auntie)
→ [ setTimeout
存放事件佇列]
→ washingPlate()
→ 執行事件佇列: setTimeout
回電給阿姨
var a;
console.log(a);
//undefined
//記憶體有a 但是沒有值
console.log(a);
// a is not defined
//記憶體沒有a
另外必須避免將 undefined 賦予到變數上
需要把值設為空值時,建議使用 null ,才不會產生混亂。
MDN記憶體管理 https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Memory_Management
Wiki記憶體流失 https://zh.wikipedia.org/wiki/内存泄漏
知乎-JavaScript 中的垃圾回收 https://zhuanlan.zhihu.com/p/23992332
深入淺出 JavaScript 内存管理,垃圾回收 https://segmentfault.com/a/1190000011231206
-後記-
已經囤好下一個禮拜的文章了,昨天竟然忘記發文 QQ