原文地址:git
1-1 理解 Javascript 執行上下文和執行棧github
1-5 JavaScript深刻之4類常見內存泄漏及如何避免bash
原文地址數據結構
執行上下文就是當前JavaScript代碼被解析和執行時所在環境的抽象概念,JavaScript 中運行任何的代碼都是在執行上下文中運行。閉包
分兩階段建立函數
原文地址工具
JavaScript 引擎並不是一行一行地分析和執行程序,而是一段一段地分析執行。
var a = 20;
var b = 'abc';
var c = true;
var d = { m: 20 }
複製代碼
在JavaScript中,最經常使用的是經過標記清除的算法來找到哪些對象是再也不繼續使用的,a=null是一個釋放引用的操做,脫離執行環境,這個值會在下一次垃圾收集器執行操做時被找到並釋放。
JavaScript的內存管理機制是:內存基元在變量(對象,字符串等等)建立時分配,而後在他們再也不被使用時「自動」釋放。後者被稱爲垃圾回收。
JS內存空間分爲棧(stack)、堆(heap)、池(通常也會歸類爲棧中)。 其中棧存放變量,堆存放複雜對象,池存放常量。
內存分配 --- 內存使用 --- 內存回收
存在一個致命的問題:循環引用。若是兩個對象相互引用,儘管他們已再也不使用,垃圾回收器不會進行回收,致使內存泄露。
標記清除算法將「再也不使用的對象」定義爲「沒法達到的對象」。從根部(在JS中就是全局對象)出發定時掃描內存中的對象,凡是能從根部到達的對象,都是還須要使用的。那些沒法由根部出發觸及到的對象被標記爲再也不使用,稍後進行回收。
在 JavaScript 文件頭部加上 'use strict',能夠避免此類錯誤發生。啓用嚴格模式解析 JavaScript ,避免意外的全局變量。
本質上,閉包的鏈表已經建立,每個閉包做用域攜帶一個指向大數組的間接的引用,形成嚴重的內存泄漏。