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简单遍历获取对象中的属性值的方法示例

    下面是关于“JS简单遍历获取对象中的属性值的方法示例”的完整攻略: 什么是JS对象? 在JavaScript中,对象是一种复杂的数据类型,它允许开发人员存储和组织以键值对的方式描述的数据。对象通常使用大括号{}来表示,其中键和值之间使用冒号:连接。 在JS中,对象中的属性值可以是任意数据类型。 示例: var person = { name: "张…

    JavaScript 2023年5月27日
    00
  • BOM系列第二篇之定时器requestAnimationFrame

    下面是关于BOM系列第二篇之定时器requestAnimationFrame的详细讲解: 什么是定时器requestAnimationFrame requestAnimationFrame是浏览器提供的一种类似定时器的 API,它可以让我们方便地控制动画的帧数,实现流畅的动画效果。 requestAnimationFrame的用法 setInterval和s…

    JavaScript 2023年6月11日
    00
  • javascript 动态生成私有变量访问器

    JavaScript 动态生成私有变量访问器,即通过闭包来实现私有变量的访问控制,让外部无法直接访问到变量,只能通过定义的方法来访问或修改变量,以保证变量的安全性和封装性。 以下是实现动态生成私有变量访问器的完整攻略: 1. 创建一个工厂函数 首先,创建一个工厂函数,用于生成私有变量访问器。 工厂函数接收一个参数,即要生成的私有变量,然后返回一个对象,该对象…

    JavaScript 2023年6月11日
    00
  • javascript cookie的基本操作(添加和删除)

    Javascript Cookie 的基本操作 添加 Cookie 以下是添加Cookie的步骤: 创建一个 Date 对象用于设置 Cookie 过期时间。 将 Cookie 信息存储到一个变量中,变量必须是一个字符串。 使用 document.cookie 将 Cookie 写入浏览器的 Cookie 中。 以下是一个简单的示例,设置一个名为 usern…

    JavaScript 2023年6月11日
    00
  • 5款Ajax 文件上传控件

    Ajax文件上传控件是很常见的一些Web技术之一,它可以使得网页用户在不刷新页面的情况下上传文件,并且可以在上传的过程中实时显示上传进度。这里我们介绍5款常见的Ajax文件上传控件。 1. AjaxUpload AjaxUpload是一种轻量级文件上传控件,代码很少,使用也非常简单,只需要用一个额外的JS文件即可。下面是一个简单的演示: new AjaxUp…

    JavaScript 2023年6月11日
    00
  • JS中URL.createObjectURL使用示例讲解

    JS中URL.createObjectURL使用示例讲解 什么是URL.createObjectURL? 在JavaScript中,URL.createObjectURL() 是一种方便的方法,可以将 Blob 或 文件对象转换为一个URL字符串,用于引用和使用。 URL.createObjectURL的语法 objectURL = URL.createOb…

    JavaScript 2023年5月27日
    00
  • JavaScript字符串转换数字的方法

    JavaScript字符串转换数字的方法有很多种。以下是几种常见的转换方法: 使用parseInt()函数 parseInt()函数可以将一个字符串转换成整数。如果字符串包含了非数字字符,则会忽略这些字符。 let str = "123"; let num = parseInt(str); console.log(num); // 123…

    JavaScript 2023年5月28日
    00
  • JavaScript中Array.from()的超全用法详解

    JavaScript中Array.from()的超全用法详解 什么是Array.from() Array.from()是ECMAScript6中新增的一个方法,可以将类数组对象和可迭代对象(如Set、Map)转换成真正的数组,方便对数据进行操作。 Array.from()的语法结构 Array.from(iterable[, mapFn[, thisArg]…

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