JavaScript最佳實(shí)踐:可維護(hù)性

代碼約定

一、可讀性

  • 代碼縮進(jìn)
  • 包含注釋

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

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

三、變量類型透明

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

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

2.使用匈牙利標(biāo)記法來指定變量類型
“o”代表對象,“s”代表字符串,“i”代表整數(shù),“f”代表浮點(diǎn)數(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";

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

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

三、解耦應(yīng)用邏輯/事件處理程序

一個例子:

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";
        }
    }
}

當(dāng)按下Enter鍵,取得事件的目標(biāo)并傳遞value屬性,這是一個應(yīng)用邏輯。得到屬性之后通過判斷值來改變樣式則為事件處理。
可以重寫為:

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";
    }
}

從事件處理程序中分離應(yīng)用邏輯的好處:

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

編程實(shí)踐

一、尊重對象所有權(quán)

在企業(yè)環(huán)境中最重要的編程實(shí)踐就是尊重對象所有權(quán),它的意思是你不能修改不屬于你的對象。如果你不負(fù)責(zé)創(chuàng)建或維護(hù)某個對象、它的對象或者它的方法,那么你就不能對它們進(jìn)行修改。

  • 不要為實(shí)例或原型添加屬性;
  • 不要為實(shí)例或原型添加方法;
  • 不要重定義已存在的方法;

二、避免全局變量

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

這段代碼包含了兩個全局變量:變量URL和函數(shù)sayURL()。其實(shí)可以創(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進(jìn)行修改,都要找到函數(shù)并在其中修改代碼。而每次修改應(yīng)用邏輯的代碼,都可能會引入錯誤。可以通過將數(shù)據(jù)抽取出來變成單獨(dú)定義的常量的方式,將應(yīng)用邏輯與數(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è)置允許數(shù)據(jù)在無須接觸使用它的函數(shù)的情況下進(jìn)行變更。Constants對象甚至可以完全在單獨(dú)的文件進(jìn)行定義,同時該文件可以由包含正確值的其他過程根據(jù)國際化設(shè)置來生成。

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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