養成良好的編碼習慣,提高代碼的可維護性 避免定義全局變數或函數 避免定義全局變數或函數 定義全局的變數和函數,會影響代碼的可維護性。如果在頁面中運行的javascript 代碼是在相同的作用域裡面,那就可能代碼之間存在互相影響的可能性。 有很多種手段可以解決因為定義了全局變數而導致代碼"污染"的問題 ...
養成良好的編碼習慣,提高代碼的可維護性
-
避免定義全局變數或函數
定義全局的變數和函數,會影響代碼的可維護性。如果在頁面中運行的javascript 代碼是在相同的作用域裡面,那就可能代碼之間存在互相影響的可能性。
有很多種手段可以解決因為定義了全局變數而導致代碼"污染"的問題。
1.最簡單的方法是把變數和方法封裝在一個變數對象上,使其變成對象的屬性。例如:
var myTes={
length:0'
init:function(){...},
action:function(){...}
}
2.另一種改進的方案是把全局的變數包含在一個局部作用域中,然後在這個作用域中完成這些變數的定義以及變數使用的邏輯。例如,可以通過定義一個匿名函數實現:
(function()
{
var length=0;
function init(){...}
function action(){...}
})()
所有的邏輯都包含在了這個立即執行的匿名函數中,形成了一個獨立的模塊,最大限度的防止了代碼之間的"污染"。當然,在實際的業務中,模塊之間會有交互,這時可使用return語句,返回需要公開的介面。
var myDocument=(function()
{
var length=0;
function init(){...}
function action(){...}
return {
init:init
}
})();
外部代碼訪問init()方法時,就可以調用myDocument.init了。此代碼巧妙地做到了代碼邏輯的封裝,又公開了外部需要訪問的介面,是模塊化最佳實踐之一。
3.確保在定義變數時使用var關鍵字。如果定義變數時沒有使用var,瀏覽器解析時並不會報錯,而是自動把這一變數解析為全局變數,比如如下的代碼就定義了一個全局的變數length:
(function()
{
length=0;
function init(){...}
function action(){...}
}
)()
-
使用簡化的編碼方式
//對象創建
var persion=new Object();
person.age=23;
person.name='daniel';
改為:
var person={age:23,name:'daniel'};
//數組創建
var list=new Array();
list[0]=12,
list[1]=20;
list[2]=24;
改為:
var list=[12,20,24];
-
使用比較運算符=== 而不是 ==
-
避免使用with語句
在javascript中,with語句可用來快捷地訪問對象地屬性。with語句地格式如下:
with(object)
{
.......
}
with語句地原理是:javascirpt解析和運行時,會給with語句單獨建立一個作用域,而和with語句結合的屬性則成為了此作用域的局部變數,因此可直接訪問。例如:
with(Math)
{
a=PI*r*r;
}
以下代碼等同於以上代碼
a=Math.PI*r*r;
使用with語句確實簡化了代碼,但使用with語句可能也會帶了一些bug已經相容問題
- 使得代碼難以閱讀,對於with語句內部的變數引用,只有在運行時才能知道變數屬於哪個對象。例如:
function f(x,o)
{
with(o)
{
print(x);
}
}
以上with語句中的x,可能來自於參數x,也可能來自o參數上的x屬性。
2.with語句的設計方面也有缺陷,在with語句內部修改和with語句結合的對象後,並不能同步到with內部,即不能保證對象數據的一致性。例如:
var group ={
value:{
node:1
}
};
with(group.value)
{
group.value={
node:2
};
//顯示錯誤:1
console.log(node);
}
//顯示正確:2
console.log(group.value.node);
-
避免使用eval
- 有時使用eval函數會讓代碼難以閱讀,影響代碼的可維護性。如:
如果通過變數來獲取某個對象的屬性值,可以使用eval('obj.'+key);
其實可以使用下標法取得屬性值:obj[key]
2. eval的使用也存在安全性問題,因為它會執行任意傳入的代碼,而傳入的代碼有可能是未知的或者來自不受控制的源。
.使用更嚴格的編碼格式
設立嚴格模式的目的主要是為了消除javascript語法上不合理的地方,從而提高代碼安全性、編譯效率、增加運行速度且更好地相容javacscript未來的新版本。
嚴格模式主要是針對如下不合理的地方做了改進,包括:禁用with關鍵字、防止意外的全局變數、函數中的this 不再預設指向全局、防止函數參數重名、防止對象 屬性重名、更安全的使用eval等。
啟用嚴格模式很簡單,主要在代碼中添加如下代碼即可:
"use strict";
使用嚴格模式時需要遵循的幾條最佳實踐。
- 不要在全局中啟用嚴格模式
為了相容一些老代碼,最好不要全局啟用嚴格模式,如果想給大量的代碼設置嚴格模式,則可以把代碼包含在一個立即執行的函數中,併在函數開頭啟用嚴格模式,示例代碼如下:
(function(){
"use strict"
// ..........
})();
2. 如果要更嚴格地編寫javascript代碼,可以使用javascript代碼檢查工具。目前最流行的檢查工具主要是JSLint和JSHint。