1、最小全局變量
全局變量:在任何函數內部聲明或未聲明而直接使用的變量。
全局對象:在任何函數的外部可以使用this訪問,window指向該全局對象。
全局變量是全局對象的屬性。
2、全局變量的問題
由於頁面中常含引入的第三方文件,故可能存在命名衝突的問題,導致先定義的變量被覆蓋。
不使用var聲明的變量會隱含成爲全局變量,如:result = 0;
避免出現全局變量命名衝突的辦法是儘量使用var對變量進行聲明,
可以使用鏈分配:var a,b; 但不要使用任務鏈:var a=b=0;該寫法會導致b成爲隱式全局變量。
3、var聲明的全局變量與隱式全局變量的區別
var聲明的全局變量不能通過delete global_var 刪除;
隱式全局變量可以通過delete 進行刪除。
4、訪問全局對象
可在任何層級的函數作用域中訪問全局對象:
var global = (function () {
return this;
}());
5、避免全局變量命名衝突的方法
單var模式
function func() {
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
// function body...
}
初始化變量同時初始化值的做法是很好的。
當使用DOM(文檔對象模型)引用時,可以使用單一的var把DOM引用一起指定爲局部變量,就如下面代碼所示:
function updateElement() {
var el = document.getElementById("result"),
style = el.style;
// 使用el和style乾點其他什麼事...
}
6、var聲明提升
// 反例
myname = "global"; // 全局變量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
所有的變量聲明會被懸置到函數的頂部,爲了避免這種混亂,最好是預先聲明你想使用的全部變量。
7、for循環
當你循環獲取值時,緩存數組(或集合)的長度是比較好的形式
for (var i = 0, max = myarray.length; i < max; i++) {
// 使用myarray[i]做點什麼
}
8、for-in循環
for-in
循環應該用在非數組對象的遍歷上,使用for-in
進行循環也被稱爲“枚舉”
hasOwnProperty()
方法,當遍歷對象屬性的時候可以過濾掉從原型鏈上下來的屬性
待補充
9、避免擴增構造函數的prototype屬性
增加內置的構造函數原型會嚴重降低了可維護性,除非確保滿足以下原則:
待補充
10、switch模式
case以break清楚結束
避免貫穿
11、避免隱式類型轉換
==與===的區別
12、避免使用eval()
eval()存在安全隱患,被執行的代碼可能已經被篡改
如果你絕對必須使用eval(),你 可以考慮使用new Function()代替。
另一種方法來阻止自動全局變量是封裝eval()調用到一個即時函數中
13、parseInt的使用
在ECMAScript 3中,開頭爲”0″的字符串被當做8進制處理了,但這已在ECMAScript 5中改變了。爲了避免矛盾和意外的結果,總是指定基數參數。
var month = "06",
year = "09";
month = parseInt(month, 10);
year = parseInt(year, 10);
此例中,如果你忽略了基數參數,如parseInt(year),返回的值將是0,因爲“09”被當做8進制(好比執行 parseInt( year, 8 )),而09在8進制中不是個有效數字。替換方法是將字符串轉換成數字,包括:
+"08" // 結果是 8
Number("08") // 8
14、縮進、花括號等相關使用
15、命名規範
以大寫首字母寫構造函數
駝峯命名法
常數:字母全大寫
使用一個下劃線前綴來表示一個私有屬性或方法