在很多時候,一系列事件會觸發的很快,在這種事件中實時監聽某個值的狀態並在某個條件下執行其他操作,無疑會使效能變得十分狼狽。
為了方法講解的簡明易懂,我選擇jQuery的scroll
事件來表述。
var wh = $(window).height();
$(document).on(`scroll`,function() {
var sh = $(document).scrollTop();
if(sh<wh){
switchBlur(0);//不模糊
}else {
switchBlur(10);//模糊
}
});
如示例程式碼所示,每次監聽到scroll
事件,都會執行switchBlur
函式。比如此時的狀態是不模糊,若sh<wh
始終為ture
,switchBlur(0)
完全沒必要執行。
下面改進一下程式碼:
var blur_px;
var s1 = 0;
var s2 = 0;
var wh = $(window).height();
$(document).on(`scroll`,function() {
var sh = $(document).scrollTop();
if(sh<wh){
s1 = s2;
s2 = 0;
blur_px = 0;
}else {
s1 = s2;
s2 = 1;
blur_px = 10;
}
if(s1!=s2){
switchBlur(blur_px);
}
});
我使用s1
和s2
記錄兩個時刻的狀態。s1
表示此次scroll
事件前一次的狀態(0或1),而s2
自然表示當前的狀態,每次事件執行時,無論狀態是否發生狀態改變,都把原先s2
的值賦給s1
,而s2
則更新到最新的狀態。可以發現,switchBlur
函式只在s1
不等於s2
的時候執行,那麼什麼時候s1
不等於s2
呢?答案就是狀態發生改變的時候,s2
已經是最新的狀態,此時s1
保留的仍然是上一次事件執行時的狀態,當然不相等啦。
總結:此方法試用於只在狀態發生改變時才需要執行相關程式碼
的情況。這裡只是一個例子,可以延伸到很多需要優化效能的地方。