var

摘要

宣告一個變數, 同時可以非強制性地賦予一初始值。

版本資訊

說明
實作於: JavaScript 1.0, NES 2.0
ECMA 版本: ECMA-262

語法

var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];

參數

varnameN
變數名稱。可以是任何合法的識別字符 (identifier)。
valueN
變數的初始值。可以是任何合法的表示式 (expression)。

說明

以 var 宣告的變數, 其作用範圍 (scope) 及於該函數之內; 但是如果在函數外宣告, 其作用範圍則為全域性 (global) (亦即包納於全域物件之內)。

在函數之外使用以 var 宣告的變數是非強制的 (optional); 如果對一個未經宣告的變數賦值, 它會被暗中 (implicitly) 宣告成為一個全域變數 (亦即成為全域物件的屬性)。其中差異在於, 已宣告的變數是全域物件裡的一個無法變更 (non-configurable) 的屬性, 而未宣告的變數則是可變更的 (configurable)。

var a = 1;
b = 2;

delete this.a; // 若在 strict 模式下會出現 TypeError, 若不是, 則會無警告地 (silently) 失敗。
delete this.b;

console.log(a, b); // 丟出 ReferenceError。因為 'b' 屬性不存在於全域物件,
// 'b' 已不再是個變數。

因此, 建議你一定要宣告你的變數, 不管你要將它使用於全域範圍內或者函數內。

若未宣告變數, 將非常可能導致無法預測的結果。所以, 在 ECMAScript 5 strict mode 中, 若在函數中給一個未經宣告的函數賦值, 將會丟出錯誤。

var 提升 (hoisting)

在 JavaScript 中, 變數可以先使用再宣告。

bla = 2
var bla;
// ...

// 會被自動解譯為:

var bla;
bla = 2;

因此, 建議你永遠都把變數的宣告放在函數的最頂端。否則可能導致混亂的情況。

var i, cell;
var cells = document.getElementsByTagName('td');

for(i=0; i<cells.length; i++){
  cell = cells[i];
  cell.addEventListener('click', function(){
    cell.style.backgroundColor = '#00F';
  }, false);
}

在以上範例中, 在 event listener 中取得的 'cell' 是那個全域變數的 'cell', 但是在迴圈結束時則會取得最尾端的那個 cell。結果, 不管你點擊哪個 cell, 都只會影響到最尾端的那個 cell。(譯註: 正確的寫法請參考 http://jsfiddle.net/JohnnyWorker/ULsqN/)

範例

宣告兩個變數並賦予初始值:

var a = 0, b = 0;

給兩個變數指定單一字串值。

var a = "A";
var b = a;

// 相當於:

var a, b = a = "A";

請注意順序:

var x = y, y = 'A';
console.log(x + y); // undefinedA

// 在這裡, x 為已宣告。而 y 的宣告 (不是初始化!) 會被自動提升
// 因此, 當執行到 "x = y" 時, y 已經被宣告了 (不會擲回 ReferenceError), 其值為 'undefined'
// 然後 y 的即被指定
// 因此, 下一行變成 x === undefined 且 y === 'A', 經串加後傳回

請注意以下幾個變數的初始化動作:

var x = 0;

function f(){
  var x = y = 1; // x 被宣告為區域變數, 而 y 不是!
}
f();

console.log(x, y); // 0, 1
// x 一如預期的是全域變數
// 而 y 會被提升而溢出函數之外!

參照

Document Tags and Contributors

Contributors to this page: Johnny.Net
最近更新: Johnny.Net,