上一篇:《javascript高級程序設計》筆記:繼承
近幾篇博客都會圍繞着圖中的知識點展開javascript
因爲javascript是一門具備自動垃圾收集機制的編程語言,開發者沒必要擔憂內存的分配和回收的問題。所以,內存
一詞在javascript編程中被開發者說起較少,更有一些非專業計算機相關專業出身的開發人員對javascript中內存
的概念全無,但這絲絕不影響內存
在編程中的重要程度java
一、存放變量的比較編程
棧內存用於存放基本類型、引用類型的地址和程序的執行(佔用內存已知)
堆內存用於存放引用類型的真實內容,用於存放對象和函數(佔用內存未知)segmentfault
二、存取方式的比較瀏覽器
棧內存:「先進後出,後進先出」——類比兵兵球盒,僅當上面的出棧才能執行下面的閉包
堆內存:「隨意存取」——類比書櫥,不受入棧出棧的影響,須要某個對象或方法時,使用指針引用便可編程語言
三、內存爲何區分堆和棧(重點)函數
內存佔用大小必定程度上決定了程序執行的流暢程度,內存區分堆和棧就是從內存管理機制上使程序運行時佔用的內存最小(這與垃圾回收機制有關,後續介紹)this
當一個方法執行時,每一個方法都會創建本身的內存棧(執行環境),在這個方法內定義的變量將會逐個放入這塊棧內存裏,隨着方法的執行結束,這個方法的內存棧也將天然銷燬了。所以,全部在方法中定義的變量都是放在棧內存中的;spa
當咱們在程序中建立一個對象時,這個對象將被保存到運行時數據區中,以便反覆利用(由於對象的建立成本一般較大),這個運行時數據區就是堆內存。堆內存中的對象不會隨方法的結束而銷燬,即便方法結束後,這個對象還可能被另外一個引用變量所引用(方法的參數傳遞時很常見),則這個對象依然不會被銷燬,只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收機制纔會在覈實的時候回收它
四、基本類型與引用類型(內存分析)
在博客《javascript高級程序設計》筆記:值類型與引用類型中有詳細講解
五、垃圾回收
javascript 具備自動垃圾收集機制,也就是說,執行環境會負責管理代碼執行過程當中使用的內存
再也不用到的內存,沒有及時釋放,就叫作內存泄漏(memory leak)
比如一個餐廳,盤子老是有限的,因此服務員會去巡臺回收空盤子
(1)自動回收:標記清除
會將空盤和裝菜的盤做上標識,當服務員巡臺時,會收回空盤,釋放內存
(2)手動回收:手動倒掉了盤子裏面的菜(=null),在下次巡臺時那盤子就會被收走了
(3)內存泄露:裝着菜的盤子巡臺時沒法回收,但沒有到客人桌上
執行環境(execution context)也被稱爲執行上下文,它是javascript中最爲重要的一個概念
執行環境定義了變量或函數有權訪問的其餘數據,決定了他們各自的行爲
每一個執行環境都有一個與之關聯的變量對象
,環境中定義的全部變量和函數都保存在這個對象中(包括arguments/函數/變量)
每次當控制器轉到可執行代碼(全局或執行函數)的時候,就會進入一個執行上下文。執行環境建立時,變量對象、做用域鏈和this指向肯定(和麪章節會介紹)
執行上下文能夠理解爲當前代碼的執行環境,它會造成一個做用域
。JavaScript中的運行環境大概包括三種狀況:
(1)全局環境:JavaScript代碼運行起來會首先進入該環境
(2)函數環境:當函數被調用執行時,會進入當前函數中執行代碼
(3)eval
所以在一個JavaScript程序中,一定會產生多個執行上下文。棧底永遠都是全局上下文,而棧頂就是當前正在執行的上下文
下面結合代碼和圖解分析:
var color = 'blue'; function changeColor() { var anotherColor = 'red'; function swapColors() { var tempColor = anotherColor; anotherColor = color; color = tempColor; } swapColors(); } changeColor();
步驟:
(1)全局上下文入棧
(2)碰到changeColor()
後,changeColor的執行上下文入棧
(3)碰到swapColors()
後,swapColors的執行上下文入棧
(4)swapColors()
執行完畢,swapColors的上下文從棧中出棧
(5)changeColor()
執行完畢,changeColor的上下文從棧中出棧
圖解:
調試圖解:
(1)進入全局上下文(能夠看到變量提高的效果)
(2)進入changeColor執行環境
(3)進入swapColors執行環境,圖中造成了一個閉包closure,裏面有變量anotherColor值
(4)swapColors的執行環境出棧,回到changeColor執行環境,閉包消失
(5)changeColor的執行環境出棧,回到全局環境
總結:
(1)全局執行環境在js代碼開始執行時就建立了,在瀏覽器關閉時出棧
(2)每次某個函數被調用,就會有個新的執行上下文爲其建立,即便是調用的自身函數,也是如此
(3)函數的執行上下文的個數沒有限制
(4)同步執行,只有棧頂的上下文處於執行中,其餘上下文須要等待
下一篇:《javascript高級程序設計》筆記:變量對象與預解析
經典推薦:《javascript高級程序設計》筆記:原型圖解