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函数节流和防抖之间的区别和实现方法,节流和防抖都是优化页面性能的有效手段,对于前端工程师来说是非常实用的知识。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS函数节流和防抖之间的区分和实现详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS co 函数库的含义和用法实例总结

    JS co 函数库的含义和用法实例总结 含义 co 函数库是一个基于生成器的异步流程控制库,它可以让你用更加优雅的方式写异步代码,避免了回调嵌套的问题。co 函数库可以自动将 yield 表达式的返回值封装成 Promise 对象,并使用 Promise 对象来统一处理错误。 安装 在 Node.js 中通过 npm 安装 co 函数库: npm insta…

    JavaScript 2023年5月27日
    00
  • javascript实现图片轮换动作方法

    为实现图片轮换动作,有多种方式可以使用。其中最常用的方式是利用JavaScript语言,通过改变DOM元素上的CSS样式属性值来实现图片的轮换。 以下是基于JavaScript实现图片轮换动作的步骤: 步骤一:创建HTML结构 首先,我们需要在HTML页面中创建一个包含图片和按钮的基本结构。 HTML结构中包含以下元素: 外容器:使用div元素作为外层容器,…

    JavaScript 2023年5月28日
    00
  • javascript 中的try catch应用总结

    下面我将详细讲解“javascript 中的try catch应用总结”的攻略,希望能帮助到你。 1. 什么是try catch try…catch是JavaScript中处理异常的一种结构化机制。也就是可以捕获代码中的异常(错误),然后通过一定的处理方式来处理这个异常。try 代码块中的代码的运行过程中,如果出现了异常,就会跳转到 catch 代码块中…

    JavaScript 2023年5月28日
    00
  • Javascript Date setSeconds() 方法

    以下是关于JavaScript Date对象的setSeconds()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的setSeconds()方法 JavaScript Date对象的setSeconds()方法设置日期对象的秒部分。该方法接受一个整数,表示要设置的秒数。如果该参数超出了JavaScript所能表示的范围,则自动调整为…

    JavaScript 2023年5月11日
    00
  • JS原型对象操作实例分析

    JS原型对象是JS中非常重要的一个概念。它允许我们将一个或多个属性和方法赋值给一个函数,并允许其他对象通过继承这些属性和方法来共享它们。本文将从以下几个方面详细讲解JS原型对象的操作实例。 1. 什么是JS原型对象? JS原型对象是每个 JS 对象都具有的属性,它允许我们将对象的属性和方法共享到其他对象中。每个对象都有一个原型对象,并且它继承自其父对象的原型…

    JavaScript 2023年5月27日
    00
  • JavaScript中valueOf函数与toString方法深入理解

    JavaScript中valueOf函数与toString方法深入理解 JavaScript中的对象可以通过自身的函数或方法转换为原始值。其中,valueOf函数和toString方法都可以用来实现此目的。本文将深入探讨valueOf函数与toString方法的区别、使用场景、如何自定义和优先级等问题,并通过示例说明它们的使用方法。 区别 valueOf v…

    JavaScript 2023年5月27日
    00
  • js将当前时间格式转换成时间搓(自写)

    下面是关于如何将当前时间格式转换成时间戳的攻略。 什么是时间戳? 在计算机系统中,时间戳(timestamp),指的是一种类似于日期的格式,是一组单调递增的数字,通常表示从某个特定的时间点开始经过的秒数或毫秒数。 JS中将当前时间格式转换成时间戳的方法 JS中可以采用Date对象及其内置的方法来获取当前时间的格式,并将其转换为时间戳。 获取当前时间的格式 可…

    JavaScript 2023年5月27日
    00
  • js用闭包遍历树状数组的方法

    JS用闭包遍历树状数组的方法,主要是为了实现对树形结构数据的深度遍历,下面是具体步骤: 1.构建树状结构数据 首先我们需要构建一棵树状结构数据,可以手动构建,也可通过API请求获取,以下是手动构建的代码示例: const treeData = [ { id: 1, title: ‘Node 1’, children: [ { id: 2, title: ‘N…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部