前端開發中的Javascript規範,來學習一下吧
前言
在之前的一篇文章《前端開發過程中的HTML規範,來學習一下吧》中,我們有講過前端開發過程中需要注意到的HTML規範問題,今天這篇文章我們繼續來看下關於Javascript的規範問題。
全局命名與IIFE
我們總是會在Javascript文件中定義變量,但是一不留神就會將其定義成全局變量,如果引用的外部JS文件較多,很容易出現全局變量汙染的情況。
我們不推薦總是在全局空間定義變量的行為,因為所有在全局空間定義的變量都是掛在window對象上,很容易出現變量汙染,如下所示。
IIFE就可以防止出現全局變量汙染的情況,IIFE是立即執行的函數表達式,在IIFE內部會創建一個封閉的作用域,內部定義的變量不會影響外部的執行環境,而且可以通過參數傳遞的形式引用外部變量,最重要的一點是在函數執行完後會立即釋放佔用的內存。
我們推薦使用下面這種寫法。
IIFE用法
為了避免全局變量的干擾,我們建議所有腳本文件都從IIFE開始。
我們都知道之所以叫立即執行的函數表達式,是因為在函數表達式後面會多一個執行的括號。這個執行的括號可以出現在兩個地方,不管是在內部還是外部,都是有效的。但是為了讓整個函數表達式看起來像一個整體,我們推薦將括號寫在裡面。
因此我們不推薦以下寫法。
而推薦以下寫法。
同樣,我們可以通過參數傳遞的形式引用外部變量。
定義域和變量提升
我們都知道在ES5中是沒有塊級作用域概念的,只有函數級作用域,而且由於變量提升的存在,在函數內部聲明的變量都會提升至函數頂部,這就會造成一些難以預料的問題。
首先我們來看看變量提升是什麼樣的情況?看看下面一段代碼。
上面這段代碼返回的結果是undefined,並不是'Hello Shenzhen',這是因為變量v會在函數內部被提升至函數頂部,實際執行的其實是下面這段代碼。
為了降低變量提升所帶來的編碼風險,我們應該手動聲明定義的變量和方法,並把其放在函數頂部。
我們不推薦以下寫法。
我們推薦以下寫法。
比較判斷
在編寫判斷相等類型的條件語句時,總是使用嚴格相等(===),這樣可以避免Javascript在執行類型轉換時帶來的問題。
我們看下面一個例子,定義一個函數,傳入一個數字,如果等於5,則將這個數加5返回。如果不使用嚴格等於,在傳入一個字符串'5'後,會返回'55'。
因此,我們推薦在使用相等判斷時都採用嚴格相等(===)。
分號
強烈建議在所有結束語句後面加上分號,如果不加上分號會引起一些很難發現的問題。我們看看下面一段代碼。
在上面這段代碼執行後,我們發現即使resultOperation()函數返回-1,與-1相等,後面的method方法仍然被調用。
這是因為在上面定義的數組末尾沒有加上分號,這個數組會與下面一行的-1當做表達式執行,任何非空數組-1都會返回NaN,NaN與resultOperation的返回結果-1不相等,因此後面的method方法會被執行。
省略分號不寫,不只是會出現上述的問題,還有很多,這裡不一一列舉。
因此,建議在每個結尾的語句後加上分號,養成一個好的習慣。
閉包
閉包作為前端面試題中必不可少的知識點是應該要掌握的,而且在前端開發中經常會涉及到,關於閉包的問題,在我寫的一篇文章《前端面試中不可逃避的閉包問題,你真的瞭解嗎?》中有詳細介紹,大家可以好好看下。
結束語
今天這篇文章詳細的介紹了在前端開發過程中涉及到的Javascript規範問題,可能還不夠全面,大家可以自行補充。