JSBench使用html
連接地址:https://jsbench.me/,ops越大越好,每秒執行次數。因爲瀏覽器多線程,儘量一個標籤頁進行測試,測試過程當中不要切換線程,保持數據的準確性前端
圖解堆棧中代碼執行流程node
let a = 10 function foo(b){ let a = 2 function baz(c){ console.log(a+b+c) } return baz } let fn = foo(2) fn(3)
代碼執行時,EC全局 VO變量對象瀏覽器
function foo(b){...}
name:foo
length:1
fn = foo(2)
時,會開闢一個函數foo的執行上下文 EC(foo)EC(foo) 初始化this = window, 做用域鏈向外<foo.AO,VO>,AO變量對象緩存
function baz(c){...}
name:baz
length:1
fn(3)
時,會開闢一個函數baz的執行上下文 EC(baz)EC(baz) 初始化this = window, 做用域鏈向外<baz.AO,foo.AO,VO>,AO變量對象,AO變量對象多線程
儘可能減小if..else.. 使用return代替函數
對於明確的條件分支建議用switch..case代替else if().. 測試
else if只適合區間判斷this
function doSomething(part,chapter){ const parts = ["ES2016","TOM","jack","React"] if(part){ console.log("請確認模塊信息") return; } if(!parts.includes(part)) return; console.log("屬於當前課程") if(chapter <= 5) return; console.log("您須要提供VIP身份") } doSomething("ES2016",6)
減小做用域鏈查找層級spa
var name = "zca" function foo(){ name = "mcgee" //這裏的name在全局聲明,這裏只是賦值 function baz(){ var age = 38 console.log(age) console.log(name) } baz() } foo()
時間更快的寫法,(時間換空間的方式)
裏面又var了,新聲明會在內存開闢新空間,佔內存。若是name數據量特別大,反而上面更好,(空間換時間)
var name = "zca" function foo(){ var name = "mcgee" //這裏的name屬於foo內的 function baz(){ var age = 38 console.log(age) console.log(name) } baz() } foo()
每次都會查找ele對象,將ele對象緩存
..html.. <div id="skip" class="skip"></div> ..js.. var oBox = document.getElementById("skip") // function hasEle(ele,cls){ // return ele.className == cls // } function hasEle(ele,cls){ var clsname = ele.className return clsname == cls } console.log(hasEle(oBox,'skip'))
對於對象類型字面量形式略優於構造函數形式,對於基本類型字面量遠優於構造函數式
經過函數式建立對象
let tests = ()=>{ let objs = new Object() objs.name="mcgee" objs.age=18 return objs }
經過字面量建立對象
let tests = ()=>{ let objs = { name:"mcgee", age:18 } return objs }
對於基本類型字面量遠優於構造函數式
var str1 = "asdaasdsqwe" var str2 = new String("asdaasdsqwe") //至關於調用函數,多作一些事,擴容更好一些
循環體內代碼越多,執行的越多,效率越慢
將循環體內固定值或者重複的提取出來,
循環方式的選擇 for while
var test = ()=>{ var arr = ["mcgee",18,"我爲前端而活"] var i for(i=0;i<arr.length;i++){ console.log(arr[i]) } }
var test = ()=>{ var arr = ["mcgee",18,"我爲前端而活"] var i,len=arr.length //固定值緩存 for(i=0;i<len;i++){ console.log(arr[i]) } }
var test = ()=>{ var arr = ["mcgee",18,"我爲前端而活"] var len=arr.length while(len--){ //減到0就停掉了 更快 console.log(arr[len]) } }
減小聲明及語句數
這與緩存彷佛並不違背,頻繁調用的緩存提升運行效率,而非頻繁調用或固定值儘可能少用聲明
<div id="box" style="width:100px;height:100px;"></div> var oBox = document.getElementById("box") var test = (ele)=>{ let w = ele.offsetWidth let h = ele.offsetHeight return w*h } //方式更快,頻繁使用的才緩存 var test = (ele)=>{ return ele.offsetWidth*ele.offsetHeight } console.log(test(oBox))
又例如
var test = ()=>{ var name="sd" var age = 18 var str = "55asdada11111" return name+age+str } //方式更快(詞法分析,語法分析,語法轉換,代碼生成) var test = ()=>{ var name="sd", age = 18, str = "55asdada11111" return name+age+str }
採用事件委託
利用js元素冒泡的機制,把本來須要去綁定的響應事件的子元素去委託給父元素
<ul id="ul"> <li>mcgee</li> <li>18</li> <li>"woaixx"</li> </ul> var list = document.querySelectorAll("li") function showTxt(ev){ var obj = ev.target if(obj.nodeName.toLowerCase() === 'li') { console.log(obj.innerHTML) } } // for(let item of list){ // item.onclick = showTxt // } var oUl = document.getElementById("ul") oUl.addEventListener("click",showTxt,true)