iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
自我挑戰組

JavaScript核心篇系列 第 6

【JavaScript 核心】記憶體 & 同步、非同步

  • 分享至 

  • xImage
  •  

記憶體存放與釋放

記憶體的生命週期:
1.配置記憶體空間:宣告值時完成配置
2.使用配置的記憶體空間
3.釋放不再用到的記憶體空間

JavaScript 的回收機制:當沒有任何物件參考它時,就會被視為可回收的記憶體。

看似簡單的 配置→使用→回收 這三個步驟
其中隱藏一些需要注意的要素
當我們離開懵懂初學階段往更高境界(提升效能)尋求時
對於記憶體的運作要更了解
查找網上資源時有提到:

記憶體流失(Memory leaks):疏忽或錯誤造成未能釋放已經不再使用的記憶體。

1.循環調用:幾個變數相互調用而導致無法回收。不需再用到時賦予 null 來解除引用

解除引用的真正作用是讓值脫離執行環境,以便垃圾收集器下次運行時將其回收。

2.函式內沒有經過宣告而導致變成全域變數,以及盡量避免使用全域變數

3.計時器 & 回調函數 : 在 setInterval setTiemout 沒有結束前,回調函數就無法被回收,
直到調用後才算結束,或是使用 clearInterval clearTimeout 來清除。


執行緒與同步、非同步

單執行緒:一次只能執行一個任務 ( JavaScript 屬於此種)
多執行緒:可以執行多種任務

同步: 任務依序執行
非同步setTimeouteventAJAX 等的這種非同步行為則會先放到事件佇列,等到主要任務都跑完後才會開始執行

※為什麼要有非同步行為?假設今天要撈 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 回電給阿姨


補充:Not Defined VS undefined

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


上一篇
【JavaScript 核心】函式提升
下一篇
【JavaScript 核心】陳述式與表達式
系列文
JavaScript核心篇19
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言