1. 程式人生 > 實用技巧 >javascript效能優化三 之程式碼優化

javascript效能優化三 之程式碼優化

程式碼優化介紹

如何精準測試Javascript效能

  • 本質上就是採用大量的執行樣本進行數學統計和分析
  • 使用基於Benchmark.js的https://jsperf.com/完成

Jsperf使用流程

  1. 使用GitHub賬號登入
  2. 填寫個人資訊(非必須)
  3. 填寫詳細的測試用例資訊(title、slug)
  4. 填寫準備程式碼(DOM操作時經常使用)
  5. 填寫必要有setup與teardown程式碼
  6. 填寫測試程式碼片段

Setup當前的一個前置準備工作,teardown是所有執行程式碼執行後要做的銷燬的動作
在這裡插入圖片描述
慎用全域性變數

為什麼要慎用?

  • 全域性變數定義在全域性執行上下文,是所有作用域鏈的頂端
  • 全域性執行上下文一直存在於上下文執行棧,直到程式退出
  • 如果某個區域性作用域出現了同名變數則會遮蔽或汙染全域性

第一種採用全域性變數,第二種採用區域性變數,然後用jsperf來比較一下兩者的差異
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
結果可以看出全域性的效果還是非常差的。

快取全域性變數
在程式執行過程中,有些地方的全域性變數是不可避免的,可以將使用中無法避免的全域性變數快取到區域性,比如當我們查詢dom元素的時候,必須使用到document,但是document不是我們後面去定義的,是內建好了去使用的,這種情況下可以把大量需要重複使用的變數放置某個區域性變數中,從而達到快取的效果。
在這裡插入圖片描述
在這裡插入圖片描述
這裡放沒有js的html程式碼
在這裡插入圖片描述
結果可以看出,快取過的程式碼稍微有點優勢。

通過原型物件新增附加方法


在原型物件上新增例項物件需要的方法,把物件放在建構函式的內部和原型鏈上的對比
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
差別還是比較大的。。。以後還是儘量在原型鏈上增加方法吧。

避開閉包陷阱
在這裡插入圖片描述
關於閉包

  • 閉包是一種強大的語法
  • 閉包使用不當很容易出現記憶體洩漏
  • 不要為了閉包而閉包
    在這裡插入圖片描述
    如果btn元素不存在了,但是el有一個引用關係,所以垃圾垃圾回收機制也不會回收
    在這裡插入圖片描述
    在下面把el置為null,可以釋放這個dom的引用

避免屬性訪問方法使用

JavaScript中的面向物件

  • JS不需屬性的訪問方法,所有屬性都是外部可見的
  • 使用屬性訪問方法只會增加一層重定義,沒有訪問的控制力
    在這裡插入圖片描述
    對比這兩段程式碼,一個有屬性的訪問函式,一個直接使用物件中的屬性
    在這裡插入圖片描述
    在這裡插入圖片描述
    差距還是比較大的。。。下次不要提供訪問方法了,直接用吧。。。

For迴圈優化
在這裡插入圖片描述
在這裡插入圖片描述
相差不多,但是當達到一定量的時候還是有差距的,可以選擇length先獲取到。

選擇最優的迴圈方法
在這裡插入圖片描述
猜猜哪個效率高。。。
在這裡插入圖片描述
Foreach效率最高。其次for

節點新增優化
節點的新增操作必然會有迴流和重繪
在這裡插入圖片描述
在這裡插入圖片描述
通過數值可以看出,文件碎片要快一點的。

克隆優化節點操作
在這裡插入圖片描述
在這裡插入圖片描述
差不多吧,用克隆來優化節點的操作稍微快一丟丟吧。。。

直接量替換Object操作
在這裡插入圖片描述