函數節流
說明:在規定的時間內,第一執行函數生效,后面的不生效,只有大于設定的時間才執行下一次。
用途:一般用于一個需要頻繁觸發的函數,出于優化性能的考慮,只讓函數觸發的第一次生效,在等待的時間內函數不生效,當超過等待的時間才開始下一次的執行。一般用于滾輪加載,頻繁請求網絡等
代碼片段
(```
// 節流函數
// fn為需要傳入的函數,delay為設定的時間
function throttle(fn, delay) {
? ? //?記錄上一次剛執行完函數后的時間
? ? ? let lastTime = 0;
? ? ?//?返回一個函數,形成閉包,保存lastTime的變量
? ? ? return function() {
? ? ? ? //?記錄當前時間
? ? ? ? let nowTime = Date.now();
? ? ? ? //?判斷當前的時間減去上一次執行完函數后的時間,是否超過設定的時間
? ? ? ? if(nowTime - lastTime > delay) {
? ? ? ? //?改變this的指向
? ? ? ? ? fn.call(this)
? ? ? ? ? 保存上次執行完函數后的時間
? ? ? ? ? lastTime = nowTime;
? ? ? ? }
? ? ? }
? ? }
```)
注意:這里使用call改變this的指向,是因為函數內又嵌套了一個函數,該函數的this指向的是window,使用call能讓該函數指向調用它的對象
函數防抖
說明:在設定的時間內執行該函數,如果設定執行函數的時間內又觸發一次,就會取消上一次的執行,直到最后一次時間內超過設定的時間才執行該函數
使用:一個頻繁觸發的函數,出于性能的優化,只讓該函數在設定的時間內最后一次執行,前面在未超過的時間內函數無法生效。一般用于頻繁的點擊事件或者搜索框輸入等
代碼片段:
(```
// 防抖函數
? ? function debounce(fn, delay) {
? ? //?保存定時器的變量
? ? ? let timer = null;
? ? ? return function (...res) {
? ? ? ? //?清除上一次開啟的定時器
? ? ? ? if(timer) clearTimeout(timer);
? ? ? ? //?開啟定時器
? ? ? ? timer = setTimeout(function () {
? ? ? ? ? fn.apply(this, res)
? ? ? ? }, delay)
? ? ? }
? ? ? }
```)
兩者之間的區別:函數節流是指在第一次就會先觸發一次,而函數防抖是指在最后一次才觸發,兩者都是為了解決函數的頻繁觸發,提高性能優化。