节流函数(throttling fountion)和防抖函数(debouncing fountion)都是为了实现一个目标:缩小办法被调用的次数,进步网站效率。
罕用于解决一些会被频繁触发的事件, 比如说keydown, keyup, click, mousemove, resize等等。

节流函数(throttling founction)

举例子说,你在嗑瓜子,每次你都会把瓜子壳扔在地上,而扫地机器人则负责扫地。扫地机器人每过 10 分钟才会转回你丢瓜子壳的区域,进行打扫。当它执行完之后,就来到了,可能去厨房清扫了。这时候,无论你持续丢多少瓜子壳,扫地机器人都不会过去,直到过了 10 分钟之后。
节流函数是只会在指定的工夫周期内执行一次。

示例

实现监听窗口变动的性能

代码实现

var previous = 0;var timeId;var throttle = function (callback, interval) {  var now = new Date();  if (now - previous > interval) {    // 等以后周期完结之后,再执行    callback();    previous = now;  }};// 另一种实现节流的办法var throttle2 = function (callback, interval) {  // 如果曾经设置了定时工作,那么什么都不须要做  if (timeId) {    return;  }  // 在一段周期之后,再次设置定时工作  timeId = setTimeout(() => {    callback();    // setTimeout定时办法实现后,把timeId设置为undefined    timeId = undefined;  }, interval);};

防抖函数(debouncing fountion)

仍旧是你在嗑瓜子,然而这次是你妈妈在帮你扫地,她通知你,等你嗑完这一袋瓜子后叫她,她才会慢吞吞过去帮你扫掉。之前无论你叫她多少次,她听到了,但并不想理你。
防抖函数就是会等事件完结之后,冷却一段时间,才会执行。

示例

实现如下依据用户输出进行搜寻的性能

代码实现

<body>  <input type="text" id="search-input" />  <p>input event fired times:<span id="fired-times"></span></p>  <p>    debounce search founcion execute times:<span id="debounce-times"></span>  </p></body>
var timerId;const handleUserInput = function () {  var firedTimesDom = document.getElementById("fired-times");  firedTimes = firedTimesDom.innerHTML || 0; // 获取初始fire times  firedTimesDom.innerHTML = parseInt(firedTimes) + 1; // fire times + 1  debounce(callSearchApi, 300);};var debounce = function (callback, delay) {  if (timerId) {    clearTimeout(timerId); // 如果始终在申请,则不会调用  }  timerId = setTimeout(callback, delay); // 等申请完结之后,delay一段时间再调用};const callSearchApi = function () {  var debounceSearchTimesDom = document.getElementById("debounce-times");  debounceSearchTimes = debounceSearchTimesDom.innerHTML || 0; // 获取初始debounce search times  debounceSearchTimesDom.innerHTML = parseInt(debounceSearchTimes) + 1; // debounce search times + 1};const inputBox = document.getElementById("search-input");inputBox.addEventListener("input", handleUserInput); // input增加监听事件

总结

函数名区别实用场景
节流函数无论事件触发多少次,它只会定期执行,没有延迟时间实用于只关怀最初状态的状况,比如说输出搜寻性能,须要期待用户进行输出来获取事后输出的搜寻后果
防抖函数在事件完结的时候提早执行实用于须要晓得所有中间状态时。例如在用户调整窗口大小时跟踪屏幕宽度,并在页面内容发生变化时重新安排页面内容,而不是等到用户实现操作