[JavaScript]-----變量,作用域,內存

ECMAScript 函數的參數都將是局部變量,也就是說,沒有按引用傳遞。

一.變量及作用域

PS:在某些語言中,字符串以對象的形式來表示,因此被認爲是引用類型。ECMAScript
放棄這一傳統。

1.基本類型和引用類型的值
ECMAScript 變量可能包含兩種不同的數據類型的值:基本類型值和引用類型值。基本
類型值指的是那些保存在棧內存中的簡單數據段,即這種值完全保存在內存中的一個位置。
而引用類型值則是指那些保存在堆內存中的對象,意思是變量中保存的實際上只是一個指
針,這個指針指向內存中的另一個位置,該位置保存對象。
將一個值賦給變量時,解析器必須確定這個值是基本類型值,還是引用類型值。基本類
型值有以下幾種:Undefined、Null、Boolean、Number 和String。這些類型在內存中分別佔
有固定大小的空間,他們的值保存在棧空間,我們通過按值來訪問的。

2.動態屬性
定義基本類型值和引用類型值的方式是相似的:創建一個變量併爲該變量賦值。但是,
當這個值保存到變量中以後,對不同類型值可以執行的操作則大相徑庭。

3.複製變量值
在變量複製方面,基本類型和引用類型也有所不同。基本類型複製的是值本身,而引用
類型複製的是地址。

4.傳遞參數
ECMAScript 中所有函數的參數都是按值傳遞的,言下之意就是說,參數不會按引用傳
遞,雖然變量有基本類型和引用類型之分。

5.執行環境及作用域
var box = 'blue'; //聲明一個全局變量 (window)
function setBox() {     (window下)
alert(box); //全局變量可以在函數裏訪問
}
setBox(); //執行函數
全局的變量和函數,都是window 對象的屬性和方法。即:
var box = 'blue';
function setBox() {
alert(window.box); //全局變量即window 的屬性
}
window.setBox(); //全局函數即window 的方法

6.沒有塊級作用域
塊級作用域表示諸如if 語句等有花括號封閉的代碼塊,所以,支持條件判斷來定義變
量。
if (true) { //if 語句代碼塊沒有局部作用域
var box = 'Lee';
}

alert(box);


var 關鍵字在函數裏的區別
function box(num1, num2) {
var sum = num1 + num2; //如果去掉var 就是全局變量了
return sum;
}
alert(box(10,10));
alert(sum); //報錯


PS:非常不建議不使用var 就初始化變量,因爲這種方法會導致各種意外發生。所以初
始化變量的時候一定要加上var。

alert(i);


二 內存問題

JavaScript 最常用的垃圾收集方式是標記清除。

一般來說,確保佔用最少的內存可以讓頁面獲得更好的性能。那麼優化內存的最佳方案,
就是一旦數據不再有用,那麼將其設置爲null 來釋放引用,這個做法叫做解除引用。這一
做法適用於大多數全局變量和全局對象。

var o = {
name : 'Lee'
};
o = null; //解除對象引用,等待垃圾收集器回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章