JavaScript最佳實踐一
變量和函數名有意義
選擇易理解和簡短的名字作為變量和方法。
糟糕的命名
x1 fe2 xbqne
同樣糟糕的命名
incrementerForMainLoopWhichSpansFromTenToTwenty } createNewMemberIfAgeOverTwentyOneAndMoonIsFull
盡量避免使用變量和方法的名字去解釋值。
或許在其他一些國家是沒有意義
isOverEighteen()
通用
isLegalAge()
你的代碼就是一個故事,請保持故事情節深入人心(容易閱讀)。
避免全局
全局變量是一個相當可怕的。
原因:你代碼中的全局變量即有可能被覆蓋。
變通:使用閉包和模塊模式。
問題:所有的全局變量在其他地方都可以訪問,這是不可避免的。
var current = null; var labels = { 'home':'home', 'articles':'articles', 'contact':'contact' }; function init(){ }; function show(){ current = 1; }; function hide(){ show(); };
對象字面量:其中的任何東西都需要通過對象的名字獲得。
問題:重復的模塊名字會產生大量的代碼而且令人厭煩。
demo = { current:null, labels:{ 'home':'home', 'articles':'articles', 'contact':'contact' }, init:function(){ }, show:function(){ demo.current = 1; }, hide:function(){ demo.show(); } }
模塊模式:你需要指出哪些可以全局使用哪些不可以--在這兩之間取舍。
問題:重復的模塊名字,內部函數使用不同的語法。
module = function(){ var labels = { 'home':'home', 'articles':'articles', 'contact':'contact' }; return { current:null, init:function(){ }, show:function(){ module.current = 1; }, hide:function(){ module.show(); } } }();
揭露模塊模式:保持相同的代碼風格同時暴露全局方法和變量。
module = function(){ var current = null; var labels = { 'home':'home', 'articles':'articles', 'contact':'contact' }; var init = function(){ }; var show = function(){ current = 1; }; var hide = function(){ show(); } return{init:init, show:show, current:current} }(); module.init();
使用嚴格模式
瀏覽器的JavaScript解析引擎有很強大的容錯能力,當你需要移植代碼或者交接代碼給同事時,松散的代碼就會給你帶來麻煩。所以代碼檢查才能保證代碼的安全。
檢查你的代碼:http://www.jslint.com/
代碼注釋適中為好
好的代碼不需解釋
這是一個夸張的迷信。
注釋那些你認為需要解釋的地方,但是記住不要講解你的人生故事(不要太長)。
避免使用單行注釋//,使用/ /更安全,當換行時不會產生錯誤。
如果你使用注釋來調試代碼,這是一個很好的技巧:
module = function(){ var current = null; /* var init = function(){ }; var show = function(){ current = 1; }; var hide = function(){ show(); } // */ return{init:init, show:show, current:current} }();
注釋不能出現在用戶面前。開發代碼不是活的代碼(開發代碼不是面向用戶的代碼)
避免技術混用
JavaScript很擅長計算,獲取外部數據(Ajax)以及根據事件做出相應的回應。
例如:
在類名為mandatory且其值為空時在外圍加上紅色邊框。
var f = document.getElementById('mainform'); var inputs = f.getElementsByTagName('input'); for(var i=0,j=inputs.length;i<j;i++){ if(inputs[i].className === 'mandatory' && inputs.value === ''){ inputs[i].style.borderColor = '#f00'; inputs[i].style.borderStyle = 'solid'; inputs[i].style.borderWidth = '1px'; } }
兩個月后,產品改版不要加紅色邊框,要在在字段后面增加一個提示圖標。
其他開發會改變你的JavaScript代碼為如下:
var f = document.getElementById('mainform'); var inputs = f.getElementsByTagName('input'); for(var i=0,j=inputs.length;i<j;i++){ if(inputs[i].className === 'mandatory' && inputs.value === ''){ inputs[i].className+=' error'; } }
使用短路符號
你一旦習慣使用短路符號,就會發現你的代碼簡潔并且容易閱讀。
原代碼:
var lunch = new Array(); lunch[0]='Dosa'; lunch[1]='Roti'; lunch[2]='Rice'; lunch[3]='what the heck is this?';
改后代碼:
var lunch = [ 'Dosa', 'Roti', 'Rice', 'what the heck is this?' ];
原代碼:
if(v){ var x = v; } else { var x =10; }
改后代碼:
var x = v || 10;
模塊化
保持代碼模塊化和職責單一性。
很容易寫出一個方法來處理好多事情,可是當你要擴展功能時,你應該拆分多個方法去實現相應的功能。
為了防止出現類似的情況,你應該保證代碼的簡單和通用去完成功能,而不是大而全的方法去實現。
在另一個功能時,你可以使用揭示模式暴露方法以此來擴展方法。
好的代碼應該容易擴展而不需要重寫核心代碼。
漸進增強
避免JavaScript代碼的高度耦合。
DOM的生成耗費時間并且代價昂貴。
有些元素的生成依賴JavaScript,但當JavaScript代碼被禁用時,用戶看到的頁面就不會那么友好。
允許配置和轉移
你的代碼會隨時被改變。
包括標簽,類名和IDs以及外觀。
把這些放到可配置項中,使你的代碼易維護并可定制。
例如:
carousel = function(){ var config = { CSS:{ classes:{ current:'current', scrollContainer:'scroll' }, IDs:{ maincontainer:'carousel' } }, labels:{ previous:'back', next:'next', auto:'play' }, settings:{ amount:5, skin:'blue', autoplay:false }, }; function init(){ }; function scroll(){ }; function highlight(){ }; return {config:config,init:init} }();
總結
在這一節,我們講到來命名規范,注釋以及一些代碼組織的建議。
原文:javascript-best-practices-1
來自:http://zhuxinyong.com/2014/11/13/JavaScript%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5%E4%B8%80/