国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

JavaScript函數節流和函數去抖知識點學習

2024-05-06 15:32:19
字體:
來源:轉載
供稿:網友

概念

節流 (throttle) 讓一個函數不要執行的太頻繁,減少執行過快的調用,叫節流

去抖 (debounce) 去抖就是對于一定時間段的連續的函數調用,只讓其執行一次

throttle 應用場景

DOM 元素的拖拽功能實現(mousemove) 射擊游戲的 mousedown/keydown 事件(單位時間只能發射一顆子彈) 計算鼠標移動的距離(mousemove) Canvas 模擬畫板功能(mousemove 搜索聯想(keyup 監聽滾動事件判斷是否到頁面底部自動加載更多:給 scroll 加了 debounce 后,只有用戶停止滾動后,才會判斷是否到了頁面底部;如果是 throttle 的話,只要頁面滾動就會間隔一段時間判斷一次

debounce 應用場景

每次 resize/scroll 觸發統計事件

文本輸入的驗證(連續輸入文字后發送 AJAX 請求進行驗證,驗證一次就好)

函數去抖的實現

我們以scroll事件為例,探究如何是實現滾動一次窗口打印一個hello world 字符串。 如果不對其節流或者去抖:

window.onscroll = function () { console.log('hello world');}

這樣每滾動一次,實際上會打印多個 hello world。 函數去抖背后的思路是指,某些代碼不可能在沒有間斷的情況下連續執行。創建一個定時器,在指定的時間間隔之后運行代碼。當第二次調用該函數時,它會清除前一次的定時器并設置另一個。如果前一個定時器已經執行過了,這個操作就沒有任何意義。然而,如果前一個定時器尚未執行,其實就是將其替換為一個新的定時器。目的是只有在執行函數的請求停止了一段時間之后才執行。

《高程三》給出了最簡潔最經典的去抖代碼,如下:

function debounce(method, context) { clearTimeout(method.tId); method.tId = setTimeout(function() { method.call(context); }, 1000);}function print() { console.log('hello world');}window.onscroll = function() { debounce(print);};

再做一些改動

function debounce(delay, action) { var tId; return function () {  var context = this;  var arg = arguments;  if (tId) clearTimeout(tId);  tId = setTimeout(function () {   action.apply(context, arg);  }, delay); }}window.onscroll = debounce(1000, print);

函數節流的實現

函數節流就是讓連續執行的函數,變為固定時間段間斷地執行。 大概有兩種方式實現。

其一使用時間戳來判斷是否已經到回調執行時間,記錄上次執行的時間戳,然后每次觸發事件時執行回調,回調中判斷當前時間戳距離上次執行時間戳的時間間隔是否有*s,如果是,則執行,并更新上次執行的時間戳,如此循環。

var throttle = function(delay, action) { var last = 0; return function() {  var curr = new Date();  if (curr - last > delay) {   action.apply(this, arguments);   last = curr;  } }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 临朐县| 顺昌县| 二连浩特市| 太和县| 巴南区| 库车县| 巴南区| 麟游县| 灌南县| 罗江县| 江源县| 竹山县| 盈江县| 精河县| 湘西| 青冈县| 舒城县| 澄迈县| 大英县| 龙口市| 台山市| 平远县| 湖口县| 图们市| 宝鸡市| 绥棱县| 华阴市| 林西县| 重庆市| 河西区| 东阿县| 拉萨市| 通州区| 民县| 胶南市| 嘉鱼县| 南城县| 平舆县| 武义县| 峨边| 信宜市|