摘要:因此,所有在方法中定義的變量都是放在棧內存中的當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用因為對象的創建成本通常較大,這個運行時數據區就是堆內存。
上一篇:《javascript高級程序設計》筆記:繼承
近幾篇博客都會圍繞著圖中的知識點展開
由于javascript是一門具有自動垃圾收集機制的編程語言,開發者不必擔心內存的分配和回收的問題。因此,內存一詞在javascript編程中被開發者提及較少,更有一些非專業計算機相關專業出身的開發人員對javascript中內存的概念全無,但這絲毫不影響內存在編程中的重要程度
1. 堆內存/棧內存1、存放變量的比較
棧內存用于存放基本類型、引用類型的地址和程序的執行(占用內存已知)
堆內存用于存放引用類型的真實內容,用于存放對象和函數(占用內存未知)
2、存取方式的比較
棧內存:“先進后出,后進先出”——類比兵兵球盒,僅當上面的出棧才能執行下面的
堆內存:“隨意存取”——類比書櫥,不受入棧出棧的影響,需要某個對象或方法時,使用指針引用即可
3、內存為什么區分堆和棧(重點)
內存占用大小一定程度上決定了程序執行的流暢程度,內存區分堆和棧就是從內存管理機制上使程序運行時占用的內存最小(這與垃圾回收機制有關,后續介紹)
當一個方法執行時,每個方法都會建立自己的內存棧(執行環境),在這個方法內定義的變量將會逐個放入這塊棧內存里,隨著方法的執行結束,這個方法的內存棧也將自然銷毀了。因此,所有在方法中定義的變量都是放在棧內存中的;
當我們在程序中創建一個對象時,這個對象將被保存到運行時數據區中,以便反復利用(因為對象的創建成本通常較大),這個運行時數據區就是堆內存。堆內存中的對象不會隨方法的結束而銷毀,即使方法結束后,這個對象還可能被另一個引用變量所引用(方法的參數傳遞時很常見),則這個對象依然不會被銷毀,只有當一個對象沒有任何引用變量引用它時,系統的垃圾回收機制才會在核實的時候回收它
4、基本類型與引用類型(內存分析)
在博客《javascript高級程序設計》筆記:值類型與引用類型中有詳細講解
5、垃圾回收
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高級程序設計》筆記:原型圖解
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89930.html
摘要:作用域鏈中的下一個變量對象來自包含外部環境,而再下一個變量對象則來自下一個包含環境。這樣,一直延續到全局執行環境全局執行環境的變量對象始終都是作用域鏈中的最后一個對象標識符解析沿作用域鏈一級一級搜索標識符。 一、寫在前面 最近研究了創建Android虛擬機、vscode結合weex開發Android APP、Vmware裝MAC虛擬機的事,看的內容不夠多,接下來加油 二、變量、作用域和...
摘要:局部變量只在函數執行過程中存在。此時,局部變量就沒有存在的必要了,因此可以釋放他們所占的內存以供他們使用。引用計數的含義是跟蹤記錄每個值被引用的次數。這一做法適合于大多數全局變量和局部變量的屬性。 基本類型和引用類型的值 ECMAScript變量可能包含兩種不同數據類型的值:基本類型值和引用類型值。基本類型值指的是簡單的數據段,而引用類型的值指那些可能有多個值構成的對象。 動態的屬性 ...
摘要:具體說就是執行流進入下列任何一個語句時,作用域鏈就會得到加長語句的塊。如果局部環境中存在著同名的標識符,就不會使用位于父環境中的標識符訪問局部變量要比訪問全局變量更快,因為不用向上搜索作用域鏈。 基本類型和引用類型的值 ECMAscript變量包含 基本類型值和引用類型值 基本類型值值的是基本數據類型:Undefined, Null, Boolean, Number, String ...
摘要:檢查當前上下文中的參數,建立該對象下的屬性與屬性值。檢查當前上下文的函數聲明,也就是使用關鍵字聲明的函數。如果該變量名的屬性已經存在,為了防止同名的函數被修改為,則會直接跳過,原屬性值不會被修改。 上一篇:《javascript高級程序設計》筆記:內存與執行環境showImg(https://segmentfault.com/img/bVY4xr?w=1146&h=374); 上篇文章...
摘要:因此,出于性能的考慮,在拷貝的方式選擇上,應該結合具體的業務環境來進行選擇參考專題之深淺拷貝深入剖析的深復制 基本數據類型是按值訪問的,因為可以操作保存在變量中的實際的值;引用類型的值是保存在內存中的對象,在操作對象時,實際上是在操作對象的引用而不是實際的對象; 值類型 如果一個變量存儲的是值的本身那么就是一個值類型number / string / Boolean / Null / ...
閱讀 2416·2021-11-11 16:54
閱讀 1219·2021-09-22 15:23
閱讀 3660·2021-09-07 09:59
閱讀 2010·2021-09-02 15:41
閱讀 3295·2021-08-17 10:13
閱讀 3064·2019-08-30 15:53
閱讀 1245·2019-08-30 13:57
閱讀 1217·2019-08-29 15:16