throttle
:將乙個函式的呼叫頻率限制在一定閾值內,例如 1s 內乙個函式不能被呼叫兩次。
debounce
:當呼叫函式n秒後,才會執行該動作,若在這n秒內又呼叫該函式則將取消前一次並重新計算執行時間,舉個簡單的例子,我們要根據使用者輸入做suggest,每當使用者按下鍵盤的時候都可以取消前一次,並且只關心最後一次輸入的時間就行了。
lodash
對這兩個函式又增加了一些引數,主要是以下三個:
其實throttle
就是設定了maxwait
的debounce。
下面,我就會帶著這幾個問題去看看lodasah
的**。
functiondebounce(func, wait, options)
wait = +wait || 0
if(isobject(options))
function
invokefunc(time)
function
leadingedge(time)
function
remainingwait(time)
//根據時間判斷 func 能否被執行
function
shouldinvoke(time)
function
timerexpired()
//重啟定時器,保證下一次時延的末尾觸發
timerid =settimeout(timerexpired, remainingwait(time))
}function
trailingedge(time)
//每次 trailingedge 都會清除 lastargs 和 lastthis,目的是避免最後一次函式被執行了兩次
//舉個例子:最後一次函式執行的時候,可能恰巧是前一次的 trailing edge,函式被呼叫,而這個函式又需要在自己時延的 trailing edge 觸發,導致觸發多次
lastargs = lastthis =undefined
return
result
}function
cancel() {}
function
flush() {}
function
pending() {}
function
debounced(...args)
if(maxing)
}//負責一種case:trailing 為 true 的情況下,在前乙個 wait 的 trailingedge 已經執行了函式;
//而這次函式被呼叫時 shouldinvoke 不滿足條件,因此要設定定時器,在本次的 trailingedge 保證函式被執行
if (timerid ===undefined)
return
result
}debounced.cancel =cancel
debounced.flush =flush
debounced.pending =pending
return
debounced
}
這裡我用文本來簡單描述一下流程:
首次進入函式時因為 lastcalltime === undefined 並且 timerid === undefined,所以會執行 leadingedge,如果此時 leading 為 true 的話,就會執行 func。同時,這裡會設定乙個定時器,在等待 wait(s) 後會執行 timerexpired,timerexpired 的主要作用就是觸發 trailing。
如果在還未到 wait 的時候就再次呼叫了函式的話,會更新 lastcalltime,並且因為此時 isinvoking 不滿足條件,所以這次什麼也不會執行。
時間到達 wait 時,就會執行我們一開始設定的定時器timerexpired,此時因為time-lastcalltime < wait,所以不會執行 trailingedge。
最後,如果不再有函式呼叫,就會在定時器結束時執行 trailingedge。
unity之小遊戲
歡迎來到我們的狗刨網,我們今天主要做了三個小遊戲,分別是打磚塊,滾動的盒子和 一 首先來看第乙個小遊戲 打磚塊 public gameobject wall void start for int i 0 i 10 i for int j 0 j 10 j instantiate wall,new v...
JS之小遊戲 pet
乙個網頁的小遊戲,養寵物,可以練習一下 doctype html en utf 8 viewport content width device width,initial scale 1.0 document title head pet.js script util.js script class...
小遊戲之買房記
先上遊戲圖 體驗嘛 1.窮屌絲不要緊,只有你踏實聰明,錢會慢慢多起來的,房子也會有的。2.一開始窮,不要緊,先買些低價的物品 大豆 雞肉 防毒面具等 低賣高賣。慢慢會攢到一些錢,進入第二個階段。3.第二個階段,手機有個幾萬塊,可以買手機 汽車。同樣,低買高賣,但是別買普通的物品了,即使賺錢,還是不如...