一、防抖
当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。
手动实现一个简单的防抖装饰器:
function debounce(fn, ms) {let timeout;return function () {clearTimeout(timeout);timeout = setTimeout(() => fn.apply(this.arguments), ms);}}
二、节流
当持续触发事件时,保证一定时间段内只调用一次事件处理函数。
实现一个简单的节流装饰器:
function throttle(fn, ms) {let isThrottled = false;let savedArgs, savedThis;function wrapper() {if (isThrottled) {savedArgs = arguments;savedThis = this;return;}fn.apply(this, arguments);isThrottled = true;setTimeout(function () {isThrottled = false;if (savedArgs) {wrapper.apply(savedThis, savedArgs)savedArgs = savedThis = null;}}, ms)}return wrapper;}
