JavaScript最佳實踐:可維護性

代碼約定

一嘀趟、可讀性

  • 代碼縮進
  • 包含注釋

二、變量和函數(shù)命名

  • 變量名應為名詞如car或person
  • 函數(shù)名應該以動詞開始涂邀,如getName()肩豁。返回布爾類型值的函數(shù)一般以is開頭,如isEnable()凉泄。

三躏尉、變量類型透明

1.通過初始化指定變量類型

var fonund = false; //布爾型   
var count = -1;     //數(shù)字   
var name = "";      //字符串   
var person = null;  //對象

2.使用匈牙利標記法來指定變量類型
“o”代表對象,“s”代表字符串后众,“i”代表整數(shù)胀糜,“f”代表浮點數(shù),“b”代表布爾型蒂誉。

var bFound;  //布爾型
var iConunt; //整數(shù)
var sName;   //字符串
var oPerson; //對象

松散耦合

一教藻、解耦HTML/JavaScript

  • 避免使用包含內(nèi)聯(lián)代碼的<script>元素或者是使用HTML屬性來分配事件處理程序。
  • 避免在JavaScript中創(chuàng)建大量HTML右锨。

二括堤、解耦CSS/JavaScript

//CSS對JavaScript的緊密耦合
element.style.color = "red";
element.style.background = "blue";

盡量通過修改類名來改變樣式,讓大部分樣式信息嚴格保留在CSS中。

//CSS對JavaScript的松散耦合
element.className = "edit";

三悄窃、解耦應用邏輯/事件處理程序

一個例子:

function handleKeyPress(event){
    event = EventUtil.getEvent(event);
    if(event.keyCode == 13){
        var target = EventUtil.getTarget(event);
        var value = 5 * parseInt(target.value);
        if(value > 10){
            document.getElementById("error-msg").style.display = "block";
        }
    }
}

當按下Enter鍵讥电,取得事件的目標并傳遞value屬性,這是一個應用邏輯轧抗。得到屬性之后通過判斷值來改變樣式則為事件處理恩敌。
可以重寫為:

function handleKeyPress(event){
    event = EventUtil.getEvent(event);
    if(event.keyCode == 13){
        var target = EventUtil.getTarget(event);
        validateValue(target.value);
    }
}
function validateValue(value){
    var value = 5 * parseInt(target.value);
    if(value > 10){
        document.getElementById("error-msg").style.display = "block";
    }
}

從事件處理程序中分離應用邏輯的好處:

  • 可以更容易更改觸發(fā)特定過程的事件。如果最開始由鼠標點擊事件觸發(fā)過程鸦致,但現(xiàn)在按鍵也要進行同樣處理潮剪,這種更改就很容易。
  • 可以在不附加到事件的情況下測試代碼分唾,使其更易創(chuàng)建單元測試或者是自動化應用流程抗碰。

編程實踐

一、尊重對象所有權

在企業(yè)環(huán)境中最重要的編程實踐就是尊重對象所有權绽乔,它的意思是你不能修改不屬于你的對象弧蝇。如果你不負責創(chuàng)建或維護某個對象、它的對象或者它的方法折砸,那么你就不能對它們進行修改看疗。

  • 不要為實例或原型添加屬性;
  • 不要為實例或原型添加方法睦授;
  • 不要重定義已存在的方法两芳;

二、避免全局變量

//兩個全局變量——避免去枷!
var URL = "zhaoyuxiang.cn";
function sayURL(){
    alert(URL);
}

這段代碼包含了兩個全局變量:變量URL和函數(shù)sayURL()怖辆。其實可以創(chuàng)建一個包含兩者的對象。

//一個全局變量——推薦
var MyApplication = {
    URL: "zhaoyuxiang.cn",
    sayURL: function(){
        alert(this.URL);
    }
};

三删顶、使用常量

一個例子:

function validate(value){
    if(!value){
        alert("Invalid value!");
        location.href = "zhaoyuxiang.cn";
    }
}

如果日后需要對URL進行修改竖螃,都要找到函數(shù)并在其中修改代碼。而每次修改應用邏輯的代碼逗余,都可能會引入錯誤特咆。可以通過將數(shù)據(jù)抽取出來變成單獨定義的常量的方式录粱,將應用邏輯與數(shù)據(jù)修改隔離開來腻格。

var Constants = {
    INVALID_VALUE_MSG: "Invalid value!",
    INVALID_VALUE_URL: "zhaoyuxiang.cn"
};
function validate(value){
    if(!value){
        alert(Constants.INVALID_VALUE_MSG);
        location.href = Constants.INVALID_VALUE_URL;
    }
}

消息和URL都被定義于Constants對象中,然后函數(shù)引用這些值啥繁。這些設置允許數(shù)據(jù)在無須接觸使用它的函數(shù)的情況下進行變更荒叶。Constants對象甚至可以完全在單獨的文件進行定義,同時該文件可以由包含正確值的其他過程根據(jù)國際化設置來生成输虱。

需要注意的值的類型如下:

  • 重復值——任何在多處用到的值都應抽取為一個常量。
  • 用戶界面字符串——任何用于顯示給用戶的字符串脂凶,都應被抽取出來以方便國際化宪睹。
  • URLs——資源位置很容易變更愁茁,所以推薦用一個公共地方存放所有的URL。
  • 任意可能會更改的值——每當你在用到字面量值的時候亭病,你都要問一下自己這個值在未來是不是會變化鹅很。如果“是”,那么這個值就應該被提取出來作為一個常量罪帖。

(總結自《JavaScript高級程序設計》(第三版))

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末促煮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子整袁,更是在濱河造成了極大的恐慌菠齿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坐昙,死亡現(xiàn)場離奇詭異绳匀,居然都是意外死亡,警方通過查閱死者的電腦和手機炸客,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門疾棵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人痹仙,你說我怎么就攤上這事是尔。” “怎么了开仰?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵拟枚,是天一觀的道長。 經(jīng)常有香客問我抖所,道長梨州,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任田轧,我火速辦了婚禮暴匠,結果婚禮上,老公的妹妹穿的比我還像新娘傻粘。我一直安慰自己每窖,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布弦悉。 她就那樣靜靜地躺著窒典,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稽莉。 梳的紋絲不亂的頭發(fā)上瀑志,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼劈猪。 笑死昧甘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的战得。 我是一名探鬼主播充边,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼常侦!你這毒婦竟也來了浇冰?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤聋亡,失蹤者是張志新(化名)和其女友劉穎肘习,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杀捻,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡井厌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了致讥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仅仆。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖垢袱,靈堂內(nèi)的尸體忽然破棺而出墓拜,到底是詐尸還是另有隱情,我是刑警寧澤请契,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布咳榜,位于F島的核電站,受9級特大地震影響爽锥,放射性物質(zhì)發(fā)生泄漏涌韩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一氯夷、第九天 我趴在偏房一處隱蔽的房頂上張望臣樱。 院中可真熱鬧,春花似錦腮考、人聲如沸雇毫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽棚放。三九已至,卻和暖如春馅闽,著一層夾襖步出監(jiān)牢的瞬間飘蚯,已是汗流浹背馍迄。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孝冒,地道東北人柬姚。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像庄涡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搬设,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ??自從 2000 年以來拿穴,Web 開發(fā)方面的種種規(guī)范泣洞、條例正在高速發(fā)展。Web 開發(fā)過去曾是荒蕪地帶默色,里面東西還...
    霜天曉閱讀 507評論 0 1
  • 概要 64學時 3.5學分 章節(jié)安排 電子商務網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,197評論 0 3
  • ??JavaScript 與 HTML 之間的交互是通過事件實現(xiàn)的腿宰。 ??事件呕诉,就是文檔或瀏覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,490評論 1 11
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念吃度。通過函數(shù)可以封裝任意多條語句甩挫,而且...
    道無虛閱讀 4,564評論 0 5
  • JavaScript語言精粹 前言 約定:=> 表示參考相關文章或書籍; JS是JavaScript的縮寫。 本書...
    微笑的AK47閱讀 581評論 0 3