可讀性的大部分內容都是和代碼縮進相關的,必須保證代碼有良好的格式。可讀性的另一方面就是注釋,一般而言,有如下一些地方需要進行注釋
1.1.1 函數和方法
每個函數或方法都應該包含一個注釋,描述其目的和用于完成任務所可能使用的算法,陳述事先的假設也非常重要,如參數代表什么,函數是否有返回值等等
1.1.2 大段代碼
用于完成單個任務的多行代碼應該在前面放一個描述任務的注釋
1.1.3 復雜的算法
如果使用了一個獨特的方式解決某個問題,則要在注釋中解釋你是如何做的,這不僅僅可以幫助其它瀏覽你代碼的人,也能在下次你自己查閱代碼的時候幫助理解
1.1.4 Hack
因為存在瀏覽器差異,JavaScript代碼一般會包含一些Hack,不要假設其他人在看代碼的時候能夠理解Hack所要應付的瀏覽器問題,如果因為某種瀏覽器無法使用普通的方法,所以你需要用一些不同的方法,那么請將這些信息放在注釋中。
1.1.5 代碼排版
1.1.5.1 行長度
每行代碼應小于 80 個字符。如果代碼較長,應盡量選擇換行,下一行代碼應縮進4 個空格。這樣可以使代碼排版整齊,減輕閱讀代碼的疲勞感,以增強代碼的可閱讀性
1.1.5.2 行結束
JavaScript 語句應該以分號結束。但大多數瀏覽器允許不寫分號,只要在本應是分號的地方有一個換行符就行。但是如果代碼行較長需要換行的時候,有哪些注意事項呢?換行應選擇在操作符和標點符號之后,最好是在逗號','之后,而不要在變量名、字符串、數字、或')' ']' '++' '--'等符號之后換行。這樣可以有效的防止拷貝、粘貼而引起的錯誤,并可有效地增強代碼的可閱讀性。
例如:var valueB = valueA ///bad
+1;
可以替換為:var valueC = valueB + ///good
valueA;
1.1.5.3注釋
我們會強調代碼中注釋數量的多少,而輕視了對注釋質量的提高。編碼是及時添加注釋,會給后續代碼的維護人員帶來很大的便利。但是如果注釋不注意更新,或者由于拷貝、粘貼引起的錯誤的注釋,則會誤導閱讀人員,反而給閱讀帶來障礙,除了注釋要及時更新外,我們還應對注釋的內容要特別關注。注釋要盡量簡單、清晰明了,避免使用含混晦澀的語言,同時著重注釋的意義,對不太直觀的部分進行注解。
例如:
//following section is used to initialize golbal variables (good)
var valueA = 0; //initialize valueA to be sero (bad)
var valueB = 1;
...
//call f1 function after waiting for 50 seconds. (good)
setTimeout (f1,50000); //set timeout to be 20s (copy error)
大功能塊的功能描述:
/*
*@desc:功能描述
*@param:參數描述
*@return:返回值
*/
1.1.5.4縮進
建議使用4個空格來進行縮進
1.1.5.5空白符
適當的空白行可以大大提高代碼的可閱讀性,可以使代碼邏輯更清晰易懂。同時,在表達式中適當的留空白,也會給代碼的閱讀帶來方便,關鍵字的后面如有括號,則最好在關鍵字和左括號'('之間留空白,如 for, if, while 等。而函數名和括號之間則不宜留空白,但若是匿名函數,則必須在function 和左括號'('之間留空白,否則,編輯器會誤認為函數名為function。在表達式中,二元運算符( 除左括號'(',左方括號'[',作用域點'.')和兩個操作數之間最好留空白。一元運算符(若不是詞typeof 等)和其操作數之間不宜留空白。逗號','的后面需要留空白,以顯示明確的參數間隔,變量間隔等。分號';'之后通常表明表達語句的結束,而應空行。在for 的條件語句中,分號之后則應該留空白。
總結一句就是縮進和注釋可以帶來更可讀的代碼,還有就是用空行來將邏輯相關的代碼塊分割開可以提高程序的可讀性,增加程序的可讀性只為了在未來代碼更容易維護。
1.2變量和函數命名
JavaScript是嚴格區分大小寫的,名稱的也遵循以下規則:
- 第一個字符必須是字母、下劃線、或一個美元符號$
- 其它字符可以是字母、下劃線、美元符號或數字
- 變量、參數、成員變量、函數等名稱均以小寫字母開頭,構造器的名稱以大寫字母開頭
- 下劃線'_'開頭的變量一般習慣于標識私有/局部成員
- 美元符號'$'開頭的變量習慣于標識系統相關,比如系統進程等。應避免用下劃線'_'或美元符號'$'來命名標識符。盡可能地降低代碼的閱讀負擔
每一行最多只包含一條語句,必須將分號放在簡單語句的結尾外,雖然分號在JavaScript是可有可無了,但是為了壓縮后不容易報錯,強制性的必須每條js代碼都得以分號結束
1.2.1 變量名應為名詞
如car或person,如果是私有變量,則在名稱前加_下劃線
1.2.2 函數名應該為動詞開始
如getName(),返回布爾類型值的函數一般以is開始,如isEnable(),如果是普通函數,則第一個字母小寫,如果是構造函數,則第一個字母大寫。函數名與((左括號)之間不應該有空格。)(右括號)與 開始程序體的{(左大括號)之間應插入一個空格,}(右大括號)應該與函數名在同一行而不應該另起一行
1.2.3 變量和函數都應使用合乎邏輯的名字
不要擔心長度,長度問題可以通過處理和壓縮
1.2.4 所有變量聲明都需要放到函數最頂部聲明或者說是作用域開始部位聲明
1.3 變量類型透明
因為JavaScript是弱類型(也叫松散類型)語言,很容易忘記變量所應包含的數據類型。使用匈牙利標記法來指定變量類型,匈牙利標記法就是在變量名之前加上一個或多個字符來表示數據類型。JavaScript中最傳統的匈牙利標記法是用單個字符表示基本類型:“O”代碼對象,“S”代表字符串,“I”代表整數,“F”代表浮點數,“B”代表布爾型。如下所示
var bFound; //布爾型
var iCount; //整數
var sName; //字符串
var oPerson; //對象
javascript變量聲明的一點感想
相對于C/C++來說,ECMAScript里的for循環并不能創建一個局部的上下文。
for (var k in {a: 1, b: 2}) {
alert(k);
}
alert(k); // 盡管循環已經結束但變量k依然在當前作用域
任何時候,變量只能通過使用var關鍵字才能聲明。
上面的賦值語句:
a = 10;
這僅僅是給全局對象創建了一個新屬性(但它不是變量)。“不是變量”并不是說它不能被改變,而是指它不符合ECMAScript規范中的變量概念,所以它“不是變量”(它之所以能成為全局對象的屬性,完全是因為javascript中存在一個global對象,這樣的操作不是聲明一個變量而是給global對象增加一個a屬性。
下面看一個簡單的例題來說明問題
if (!("a" in window)) {
var a = 1;
}
alert(a);
首先,所有的全局變量都是window的屬性,語句 var a = 1;等價于window.a = 1;
你可以用如下方式來檢測全局變量是否聲明
"變量名稱" in window
第二,所有的變量聲明都在范圍作用域的頂部,看一下相似的例子:
alert("a" in window);
var a;
此時,盡管聲明是在alert之后,alert彈出的依然是true,這是因為JavaScript引擎首先會掃墓所有的變量聲明,然后將這些變量聲明移動到頂部,最終的代碼效果是這樣的:
var a;
alert("a" in window);
第三,你需要理解該題目的意思是,變量聲明被提前了,但變量賦值沒有,因為這行代碼包括了變量聲明和變量賦值。
你可以將語句拆分為如下代碼:
var a; //聲明 a = 1; //初始化賦值
所以總結起來就是當變量聲明和賦值在一起用的時候,JavaScript引擎會自動將它分為兩部以便將變量聲明提前,不將賦值的步驟提前是因為他有可能影響代碼執行出不可預期的結果。
題目中的代碼相當于:
var a;
if (!("a" in window)) {
a = 1;
}
alert(a);
根據上述例題的分析,聲明變量時如果是聲明的局部變量前面一定要加var,如果聲明的是全局變量可以不加var(最好限制全局變量的個數,盡量使用局部變量)
下面講述一個使用var的幾個特性
使用var語句多次聲明一個變量不僅是合法的,而且也不會造成任何錯誤。
如果重復使用的一個聲明有一個初始值,那么它擔當的不過是一個賦值語句的角色。
如果重復使用的一個聲明沒有一個初始值,那么它不會對原來存在的變量有任何的影響。
沒有var聲明的變量,是作為全局變量存在的;有var聲明的變量,屬于局部變量,尤其是在函數內部。并且,經過測試,帶var聲明比不帶var速度要快。函數內盡量多設局部變量,這樣即安全又快速,變量操作也更加合理,不會因為函數內胡亂操作全局變量而導致邏輯錯誤。
聲明對象時最好使用對象自面量的方式,這樣的速度相對new的方式要快很多。
變量名是自己取的,為了照顧語義和規范,變量名可能稍長,但是注意了,變量名的長度也會影響代碼的執行速度。長的變量名聲明的執行速度沒有短的快。
文章列表