Javascript進階程式設計第二版第四章–變數,範圍及記憶體問題–筆記

來源:互聯網
上載者:User

由於JavaScript 變數鬆散類型的本質,決定了它是在特定時間用於儲存特定值的一個名字而已,變數的值及其資料類型可以在指令碼的生命週期內改變。這可能既有趣又強大,同時又容易出問題。

4.1 文法

ECMAScript 變數包括兩種類型:

a)         基本類型值

儲存在記憶體中的簡單資料區段。

Undefined, Null,Boolean,Number和String,在記憶體中分別佔有固定大小的空間,一般稱它們按訪問。

b)         參考型別值

儲存在記憶體中的對象。意思是變數中儲存的實際上只是一個指標,這個指標指向記憶體中的另一個位置,該位置儲存對象

由於這種類型大小不固定,不能儲存在棧記憶體當中,但是它們的記憶體位址是固定的,我們可以儲存在棧記憶體當中。當查詢參考型別的變數時,就首先從棧中讀取記憶體位址,然後“順杆爬”地找到儲存在堆中的值。這種方式一般稱為按“引用”訪問,因為我們操作的不是實際值,而是被那個值所引用的對象。

 

4.1.1 動態屬性

只能給參考型別動態地添加屬性,不能給基本類型值添加屬性

var name = ‘豪情’;

name.age = 29;

alert(name.age); //output undefined

4.1.2 複製變數值

a)         基本類型值

從一個變數向另一個變數複製基本類型值時,會在棧中建立一個新值,然後把該值複製到為新變數分配的位置上。兩個變數不會相互影響

b)         參考型別值

當參考型別複製時,同樣會在棧中放一新的變數進去,不同的是這個新值實際上是一個指標,它指向儲存在堆中的一個對象。複製操作結束後,兩個變數實際上引用同一對象。因此,改變一個,會影響另外一個

4.1.3 傳遞參數

傳遞參數是按值傳遞的方式,參數其實就是一局部變數

對象是按值傳遞

4.1.4 檢測類型

         檢查基本類型採用 typeof

         檢查變數是不是某參考型別的執行個體,用instanceof

4.2 執行環境與範圍

         每個函數都有自己的執行環境。當執行流進入一個函數時,函數的環境就會被推入一個環境棧中,而在函數執行之後,棧將其環境彈出,把控制權返回給之前的執行環境。

         當代碼在一個環境中執行時,會建立變數對象的一個範圍鏈(scope chain)。範圍鏈的用途是保證對執行環境有權訪問的所有變數和函數的有序訪問。範圍鏈的前端,始終都是當前執行的代碼所在環境的變數對象。如果這個環境是函數,則將其使用中的物件(activation object)作為變數對象。使用中的物件在最開始時只包含一個對象,即arguments(這個對象在全域環境中是不存在的)。範圍鏈的下一個變數對象來自包含(外部)環境,而再下一個變數對象則來自下一個包含環境。這樣一直延續到全域執行環境;全域執行環境的變數對象始終都是範圍中的最後一個對象。

         標識符解析是沿著範圍鏈一級一級地搜尋標識符過程。搜尋過程始終從範圍鏈的前端開始,然後逐級向後回溯,直至找到標識符為止(如果找不到標識符,則會發生錯誤)

         每個環境都可以向上搜尋範圍鏈,以查詢變數和函數名;但任何變數都不能通過向下搜尋範圍鏈而進入另一個執行環境。

4.2.1 延長範圍鏈

         try-catch語句的catch

         with語句

對catch語句來說,其變數對象中包含的是被拋出的錯誤對象的聲明

4.2.2 沒有塊級範圍

         例如:

for(var i=0;i<10;i++){

}

alert(i); // output 10

在JavaScript中,由for語句建立的變數i 即使在for迴圈結束後,也依舊會存在於迴圈外部的執行環境中

4.3 垃圾收集4.3.1 標記清除

 

JavaScript 中最常用的是垃圾收集方式是標記清除( mark-and-sweep )。當變數進入環境時,就將這個變數標記為“進入環境”。從邏輯上講,永遠不能釋放進入環境的變數所佔用的記憶體,因為只要執行流進入相應的環境,就可能會用到它們。而當變數離開環境時,則將其標記為“離開環境”。

4.3.2 引用計數

通過跟蹤每個值被引用的次數來清除所佔用的記憶體

4.3 效能問題

在ie 中調用者window.CollectGarbage() 方法執行垃圾收集。在Opera 7+ 中,調用window.opera.collect()啟動垃圾收集常式

4.3 管理記憶體

一旦資料不再有用,就將其值設定為null來釋放其引用—這個做法一般叫“解除引用”,這個做法適用於大多數全域變數和全域對象的屬性。局部變數會在它們離開執行環境時自動被解除引用。

不過,解除一個值的引用並不意味著自動回收該值所佔用的記憶體,而是讓值脫離執行環境,以更垃圾收集器下次運行時將其回收。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.