javascript專精--最佳實踐
Web前端領域,什麼樣的實踐,才是好的處理方式?在《JavaScript高階程式設計》一書中,從三個不同的方面來描述最佳實踐:
1、可維護性
什麼是可維護性的程式碼?那麼它可能需要做到:
可理解性——其他人可接手程式碼並理解其意圖
直觀性——程式碼中的東西一看就能明白,不管其操作過程多麼複雜
可適應性——程式碼一種資料上的變化不要求重寫的方法
可擴充套件性——程式碼在架構上考慮未來對核心功能的擴充套件
可調式性——當有地方出錯時,程式碼給予足夠的提示資訊來確定問題所在
程式碼約定
<1>、可讀性
讓自己的程式碼保證良好的縮排是有必要的
給自己的程式碼寫註釋是有必要的
<2>、變數和函式命名
命名是提高程式碼可讀性的非常重要的一環
命名包括變數名、函式名、class名等等。
變數名應該是名詞,函式名應該是動詞開始。
函式也可分為邏輯功能以及事件。
<3>、變數型別透明
每申明一個變數,應該給這個變數一個初始值。
var str = '';//代表string型別
var num = 0;//代表number型別
var bool = false;//代表boolean型別
鬆散耦合
<1>、解耦 HTML/JavaScript
一般而言,JavaScript的強大能力,使得它能夠操作DOM,比如它能夠隨意的建立DOM元素、隨意的新增DOM元素到document中。但是這樣的程式碼不僅效能上存在問題,而且可讀性非常差!!!
我們要有的一個思想就是,HTML用來表示介面的內容,而JavaScript只用來定義行為。
<2>、解耦 CSS/JavaScript
JavaScript同樣能用來操作CSS,可是千萬不要這樣做!!除非你是要寫執行函式。
<3>、解耦應用邏輯和事件處理程式
操作dom,我們使用的是事件函式
作為Js,有另外一部分功能是和DOM操作不相關的邏輯,應該單獨隔離出來,封裝成函式。
程式設計實踐
<1>、尊重物件所有權
儘量的不要改變原生物件的方法,如toString()、push()、sort()等等,改變或者重寫的後果,就是合作開發的時候,別人不知道這個方法已經改變,可能就會出錯。
一定不要修改別人的物件,如果這個物件不是你建立並且維護的,那麼你就只有使用的權利。
<2>、避免全域性量
這個很好理解,全域性變數的過多使用,很可能在合作開發的時候造成衝突。如果需要使用,那就用盡可能使用較少的全域性變數。
//使用一個obj可以表示三個變數的功能。
var obj = {
a,
b,
c,
}
<3>、使用常量
你定義一個東西,一定要想,這個東西到底後面會不是被改變,如果不會被改變的話,那就儘量的把它定義成常量,作為一個公共的東西提取出來。
2、保證程式碼效能
保證自己的程式碼效能,是每個web開發人員的基本素養,雖然這方面的東西可量化的地方不多,但還是有一些比較好的程式設計模式值得去借鑑:
注意作用域
<1>、避免全域性查詢
使用全域性變數的函式,一定要比使用區域性變數的函式的開銷更大,因為要涉及到作用域鏈上的查詢。
function updateUI(){
var imgs = document.getElementsByTagName("img");
var obox = document.getElementById("box");
}
這樣的函式,呼叫了兩次document,也就是自己在作用域鏈上查找了兩次。
function updateUI(){
var doc = document;//這裡只調用一次document。
var imgs = doc.getElementsByTagName("img");
var obox = doc.getElementById("box");
}
避免多次的全域性作用域查詢,在程式設計實踐中,是很有必要的。
<2>、避免使用with語句
with語句的使用,會有額外的作用域鏈的開銷。
選擇正確方法
<1>、避免不必要的屬性查詢
多層的屬性查詢的代價會很大,比如這個的示例:
var query = window.location.href.substring(window.location.href.indexof("?"));
兩次使用window.location.href,這樣還不如這麼寫:
var url = window.location.href;
var query = url.substring(url.indexof("?"));
這樣的方式,效能明顯更高。
<2>、優化迴圈
大多數迴圈是從0開始,但是很多情況下,從最大值開始,進行減值迭代的效果明顯更高。
var list = document.getElementsByTagName('li');
for(var i = 0; i < list.length; i++){
//code
}
上面的for迴圈每次都要重新計算list的長度,這就存在效能問題,所以在for迴圈中,我們有一種說法是——優化終止條件。
下面的寫法可能會好一點:
var list = document.getElementsByTagName('li');
for(var i = 0,len = list.length; i < len; i++){
//code
}
有時候,一些迴圈是沒有必要的,我們增加一些if判斷,可能要減少很多無用操作。
<3>、避免雙重解釋
JavaScript程式碼想解析JavaScript的時候會存在雙重解釋懲罰。
當使用eval()、Function()建構函式、setTimeout()的時候,傳入一個字串,都會發生這種情況。
原因就是JavaScript解析這些字串是需要重新開啟一個解析器來解析新的程式碼。(這是不容忽視的開銷)。
eval("alert('hello world!')");//一定要避免
最小化語句數
var i = 0,j,k;
var i = 0;
var j;
var k;
這兩個申明變數的方式相比,第一是一個申明變數的語句,第二個是三個申明變數的語句。
優化DOM互動
<1>、最小化現場更新
大量的dom操作是造成頁面效能的最大幫凶,比如多次向頁面新增元素。特別是在for迴圈中!!!
使用文件片段來構建DOM結構,可能是一個好方法。
var fragment = document.createDocumentFragment();
for(var i = 0; i < 10; i++){
item = document.createElement('li');
fragment.appendChild(item);
item.appendChild(document.createTextNode('Item'+i));
}
list.appendChild(fragment);
<2>、使用innerHTML
把innerHTML設定為某個值的時候,後臺會自動建立一個HTML解析器,然後使用內部的DOM呼叫來建立DOM結構。
<3>、使用事件代理
一個ul列表,給新增一個點選事件,儘量別for迴圈新增。使用事件代理的方式,新增到ul上效能會好很多。
原文:https://blog.csdn.net/mapbar_front/article/details/78635412