網易郵箱前端Javascript編碼規范:基礎規范

openkk1 13年前發布 | 882K 次閱讀 JavaScript開發 JavaScript

網易郵箱是國內最早使用 ajax 技術的郵箱。早在 2004 年就推出了基于 ajax 引擎的極速風格郵箱,到 2012 年極速風格已經發展到第五版。最近兩年 HTML5+CSS3 以及移動終端技術方興未艾,網易郵箱也緊跟技術發展趨勢推出了 iphone,ipad 適配版的郵箱。在這么多年開發郵箱 webmail 過程中,郵箱前端團隊積累了不少心得體會,我們開發了很多基礎 js 庫,實現了大量前端效果組件,開發了成熟的 opoa 框架以及 api 組件,在此向大家做一些分享。今天想先和大家聊聊 javascript 的編碼規范。

  總所周知,javascript 是一種語法極其靈活的語言。javascript 在設計之初就只是用來為 HTML 添加動態效果的。由于他動態,弱類型等特性,以及不同瀏覽器的兼容性問題,造成了開發成本要比 java 等語言要高很多。正因為它太靈活,我們制定了適用于網易郵箱的 javascript 編碼規范,盡可能多的降低由于語法靈活造成的問題。以下將具體介紹:

  1. 變量命名規范

  變量名包括全局變量,局部變量,類變量,函數參數等等,他們都屬于這一類。

  基本規范

  變量命名都以類型前綴+有意義的單詞組成,單詞首字母都需要大寫。例如:sUserName,nCount。

  前綴規范

  每個局部變量都需要有一個類型前綴,按照類型可以分為:

  s:表示字符串。例如:sName,sHtml;

  n:表示數字。例如:nPage,nTotal;

  b:表示邏輯。例如:bChecked,bHasLogin;

  a:表示數組。例如:aList,aGroup;

  r:表示正則表達式。例如:rDomain,rEmail;

  f:表示函數。例如:fGetHtml,fInit;

  o:表示以上未涉及到的其他對象,例如:oButton,oDate;

  例外情況:

  1:作用域不大臨時變量可以簡寫,比如:str,num,bol,obj,fun,arr。

  2:循環變量可以簡寫,比如:i,j,k等。

  為什么需要這樣強制定義變量前綴?正式因為 javascript 是弱語言造成的。在定義大量變量的時候,我們需要很明確的知道當前變量是什么屬性,如果只通過普通單詞,是很難區分的。

  例如

var group = [];
group.name = 'myGroup';
/****
some code
***/
//這時候你還能一眼就看出來 group 是什么嗎?

  又例如:

var checked = false;
var check = function(){
    return true;
}
/**
some code
**/
if(check){//可能將 checked 寫成 check,由于不能很快速的發現 check 是函數,造成邏輯錯誤
    //do some thing
}

  如果我們寫成:

var bChecked = false;
var fCheck = function(){
    return true;
}
/**
some code
**/
if(bChecked){
    // do some thing
}
if(fCheck ()){
    // do other thing
}

  就清楚很多了。

  全局變量以及常量規范

  網易郵箱前端是基于“類”的概念來來開發 javascript 的(稍后會專門介紹),每個類定義都是在一個閉包函數中,除了在 window 下有類的定義而外,只允許有兩種變量定義在全局,那就是全局變量和常量。

  全局變量使用g作為前綴,定義在 window 下。例如 gUserName,gLoginTime。

  某些作為不允許修改值的變量認為是常量,全部字母都大寫。例如:COPYRIGHT,PI。常量可以存在于函數中,也可以存在于全局。

  看個例子就很容易明白為什么要這樣定義了:

var userName = "dongua";
function checkName (userName){
    //存在函數參數 userName 以及全局變量 userName,如果要比較兩個值是否相等,必需寫為
    return window.userName == userName
}

  如果使用了全局變量的前綴,就十分清晰了。

  2. 函數命名規范

  統一使用動詞或者動詞[+名詞]形式,例如:fGetVersion (),fSubmitForm (),fInit ();涉及返回邏輯值的函數可以使用 is,has 等表示邏輯的詞語代替動詞。

  如果有內部函數,使用__f+ 動詞[+名詞]形式,內部函數必需在函數最后定義。例如:

function fGetNumber (nTotal){
    if(nTotal<100){
  nTotal = 100;
   }
 return __fAdd (nTotal);

function __fAdd (nNumber){ nNumber++; return nNumber; } } alert (fGetNumber (30));//alert 101</pre>

  對象方法實現

  對象方法命名使用 f+ 對象類名+動詞[+名詞]形式;例如 fAddressGetEmail

  事件響應函數

  某事件響應函數命名方式為觸發事件對象名+事件名或者模塊名+觸發事件對象名+事件名,例如:fDivClick (),fAddressSubmitButtonClick ()

  3. 其他注意事項

  1:所有命名最好使用英語表示。

  2:所有變量名應該明確而必要,盡量避免不必要的容易混淆的縮寫。

  3:netease.events.mouse.Handler,而不是 netease.events.mouse.MouseEventHandler。

  4:對應的方法應該使用對應的動詞,例如:get/set, add/remove, create/destroy, start/stop, insert/delete, begin/end。

  5:應該避免雙重否定意義的變量,例如:bIsNotError, bIsNotFound,不可取。

  6:變量應該在最小的范圍內定義,并盡可能的保持最少的活動時間。

  7:循環變量最好在循環中定義。例如 for (var i=0,m=10;i<m;i++){ do something}。

8:盡量避免復雜的條件語句,可以使用臨時的 boolean 變量代替。

  9:一定要避免在條件中執行語句,例如:if ((i=3)>2){},不可取。

  10:不要在代碼中重復使用相同意義的數字,用一個變量代替,比如 nTotal=100; num= total。

 本文由用戶 openkk1 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!