JavaScript 執行環境皆有 global object,在 function 外可用 this 進行存取;在 browser 中,window 為 global object 的一個 property,指向 global object 本身,因此也可用 window 存取 global variable
1
2
3
4
5
gvar = "test"; // antipattern
console.log(gvar); // "test"
console.log(window.gvar); // "test"
console.log(window["gvar"]); // "test"
console.log(this.gvar); // "test"
1
2
3
4
// 如果在不同執行環境中,`window` 未必可用,若不寫死可用以下方法
var global = (function(){
returnthis;
}());
使用 global variable 可能發生命名衝突(例如有多個 libraries 或多段不同人寫的 code 時),應盡可能少用
chain assignment 也會建立 global variable
1
2
3
4
5
functionfoo(){
var a = b = 0; // a: local; b: global
var c, d;
c = d = 0; // c: local; d: local
}
隱含的 global variable(即未經 var 宣告就直接使用的)可以用 delete 刪除;因為該變數嚴格來說其實是 global object 的 property 而非變數,delete 可刪除 object 的 property 而不能刪除變數
使用單一 var
hoisting 行為:在任何位置以 var 宣告變數,其行為與「在頂端宣告」相同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bar = "global"; // global variable
functionfoo(){
console.log(bar); // "undefined"
var bar = "local";
console.log(bar); // "local"
}
foo();
// 上例相當於以下行為
bar = "global"; // global variable
functionfoo(){
var bar; // same as: var bar = undefined;
console.log(bar); // "undefined"
bar = "local";
console.log(bar); // "local"
}
foo();
在 function 開頭使用單一 var 敘述,優點:
查閱使用變數時只需找一個地方
避免 hoisting 行為造成的邏輯錯誤
減少「造成隱含的全域變數」發生
使 code 字數更精簡
1
2
3
4
5
6
7
8
9
10
functionfoo(){
var a = 0,
b = 1,
sum = a + b,
myobj = {},
i,
j,
result = document.getElementById("result"),
resultStyle = result.style;
}
預先計算 iteration 次數
使用 for loop 時預先計算次數,以避免每次皆計算而影響效能(尤其針對 HTMLCollection object 時影響更大)
1
2
3
for (var i = 0, max = myarray.length; i < max; i++) {
// ...
}
效能更佳的 loop(只使用一個變數且只判斷零與非零)
1
2
3
4
5
6
7
8
9
10
11
12
// for-loop
var i, myarray = [];
for (i = myarray.length; i--;) {
// ...
}
// while-loop
var myarray = [],
i = myarray.length;
while (i--) {
// ...
}
// 註:JSLint 看到 ++ 或 -- 會抱怨
for-in loop 不保證列出的順序,建議將 for 用於重複 array,將 for-in 用於重複 object