关键词

JS函数节流和防抖之间的区分和实现详解

JS函数节流和防抖是前端开发中常用的优化技巧,以有效降低网页在滚动或者拖拽等交互操作时因为事件处理函数过多而造成的页面卡顿和性能问题。两者的实现方式也有所区别,本文将结合示例详细讲解它们之间的区分和实现方法。

什么是JS函数节流?

JS函数节流指的是在一段时间内,无论触发多少次函数,只执行一次。也就是说,在执行函数的时间间隔内,不管触发了多少次函数,只有一次函数回调被执行,避免在高频事件中过多的调用函数以提高性能。

函数节流的实现方法一般是采用setTimeout或者requestAnimationFrame,在一定时间间隔之后再执行回调函数,如下面的代码所示:

function throttle(fn, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    if(!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  }
}

以上是一个函数节流的实现代码,函数节流的实现比较简单,一般也只需要这样的代码就能够满足我们的使用需求。在这里使用了一个闭包,在外部变量timer作为是否执行的标志,如果在执行的过程中timer有值就不执行回调函数,如果timer为null,就执行回调函数并且给timer赋值,实现了函数节约的功能。

函数节流的应用场景举个例子:给搜索框绑定onkeyup事件,实现出发一次搜索后,1s内不再响应后面的onkeyup事件,防止过多的请求和响应。

什么是JS函数防抖?

JS函数防抖,即在连续触发的事件中,只有足够大的时间间隔,才会执行回调函数。也就是说,当事件被触发时,先不执行函数,在执行连续触发事件的最后一个事件后,等待一定时间后执行回调函数。

函数防抖的实现方法比函数节流稍微复杂一些,但也不算难,需要注意判断间隔时间是否足够,如下面的代码所示:

function debounce(fn, delay) {
  let timer = null;
  return function() {
    const context = this;
    const args = arguments;
    if(timer) clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
      timer = null;
    }, delay);
  }
}

函数防抖和函数节流在实现方法上的区别主要在于:函数防抖将定时器的操作放在了最后一次触发的回调函数中,而函数节流则是在第一次回调函数触发的时候设置了一个延迟时间,在之后每过一段时间才会再次触发回调函数。

函数防抖的应用场景举个例子:给window绑定onresize事件,实现在Browser窗口大小较频繁地调整时,在停止调整大小后进行回调,在减小卡顿的同时又能保证回调的准确性。

本文详细讲解了JS函数节流和防抖之间的区别和实现方法,节流和防抖都是优化页面性能的有效手段,对于前端工程师来说是非常实用的知识。

本文链接:http://task.lmcjl.com/news/8486.html

展开阅读全文