標籤:
1. 變數
有基本類型和參考型別,這兩種類型定義方式類似(var X = XXX),操作上區別較大(參考型別可增刪改其屬性及方法)。
eg:
var j= new Object();
j.name = “呵呵”;
alert(j.name); //“呵呵”
var q = “呵呵”;
q.k = “JQK”;
alert(q.k); // undefined
關於複製,參考型別只是複製引用。
關於傳參,基本類型值的傳遞就如同基本類型變數的複製,參考型別值的傳遞則如同參考型別變數的複製。可以將ECMAScript的參數想象成局部變數。
function setName(obj) {
obj.name = “name1”;
obj = new Objact();
obj.name = “name2”;
}
var person = new Object();
setName(person);
alert(person.name); // “name1”
使用typeof及instanceof檢測類型
2. 執行環境及範圍
執行環境:執行環境定義了變數或函數有權訪問的其他資料,決定了它們各自的行為,每個執行環境都有一個與之關聯的變數對象,環境中定義的所有變數和函數都儲存在這個對象中。
全域執行環境就是最外圍的一個執行環境,根據ECMAScript實現所在的宿主環境不同,表示執行環境的對象也不同。某個執行環境中的所以代碼執行完畢後,該環境被銷毀,其變數和函數也隨之被銷毀。全域執行環境直到應用程式退出時才被銷毀。
Web瀏覽器中全域執行環境是window對象,因此所有全域變數及函數都是window對象的屬性和方法。關閉網頁或瀏覽器時全域執行環境(window)被銷毀。
JavaScript沒有塊級範圍,即if, for等塊中變數在花括弧同級處仍可訪問,
eg:
if(true) var i = 1;
alert(i); // 1
不聲明的變數會成為全域變數。strict 模式下,不允許未聲明的變數。
3. 記憶體回收
通常有兩個策略:標記清除和引用計數
標記清除就是在變數進入環境時標記為“進入環境”,離開環境時標記為“離開環境”,標記為離開環境的會在記憶體回收時被清除。現在的IE、Firefox、Chrome、Safari、Opera的JavaScript實現都使用標記清除式的記憶體回收策略。
引用計數就是記錄每個值被引用的次數。若聲明一個變數並被賦一個參考型別值時,則該值的引用次數為1,若包含該值引用的變數又取得了另外一個值,則該值引用次數減1。當引用次數為0時,就可以將其佔用記憶體回收。但引用計數存在一個嚴重的問題:循環參考。
IE9之前,IE的BOM和DOM中的對象就是使用C++以COM對象的形式實現的,而COM對象的垃圾收集機制使用引用計數策略。因此,即便JavaScript引擎使用標記清除策略實現,只要IE中涉及COM對象,就存在循環參考問題,引起記憶體流失。
要確保佔用少的記憶體來為頁面擷取更好的效能,一旦資料不再有用,最好手動將其設定為null來釋放引用(引用解除)。
JavaScript - 變數、範圍、記憶體回收