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日

相关文章

  • 解析JavaScript面向对象概念中的Object类型与作用域

    当我们说到JavaScript的面向对象,Object类型无疑是其中最重要的一种类型。它作为JavaScript所有对象的基础,为我们在开发JavaScript应用程序时提供了很多的便利和支持。同时,在JavaScript中,作用域也是一个很关键的概念。理解作用域的本质可以帮助我们更好地开发可靠、高效的应用程序。下面将详细解析这两个概念。 1. Object…

    JavaScript 2023年5月27日
    00
  • Bootstrapvalidator校验、校验清除重置的实现代码(推荐)

    讲解BootstrapValidator校验、校验清除重置的实现代码需要以下步骤: 1. 引入BootstrapValidator插件库 在HTML文档中,需要先引入BootstrapValidator的插件库,如下所示: <link rel="stylesheet" href="https://cdn.jsdelivr.…

    JavaScript 2023年6月10日
    00
  • 详解AngularJS Filter(过滤器)用法

    详解AngularJS Filter(过滤器)用法 什么是AngularJS Filter? AngularJS Filter(过滤器) 是AngularJS中的一种自定义组件,它可以对要展示在AngularJS应用程序模板上的数据进行数量、格式和类型等方面的过滤或转换,相当于是数据的预处理器。使用过滤器,可以让我们更加方便,快捷地展示数据。 例如,用户搜索…

    JavaScript 2023年6月10日
    00
  • javascript动画系列之模拟滚动条

    我来给你详细讲解 “javascript动画系列之模拟滚动条”的完整攻略。本篇攻略将分成以下几个部分介绍如何使用 JavaScript 实现一个模拟滚动条。 准备工作 在进行模拟滚动条的制作之前,我们需要有 HTML 和 CSS 的基础。这里不做过多的讲解,只讲有关滚动条部分的 HTML 和 CSS 代码。下面的代码片段是例子的 HTML 代码: <d…

    JavaScript 2023年6月10日
    00
  • JavaScript 计算笛卡尔积实例详解

    JavaScript 计算笛卡尔积实例详解 什么是笛卡尔积? 笛卡尔积是数学中一个常用的概念,其定义如下: 对于集合A和集合B,它们的笛卡尔积A×B是指:所有可能的有序数对构成的集合{ (a, b) | a∈A, b∈B }。 实际上,笛卡尔积可以推广到N个集合的情况下。假设有N个集合A1, A2, …, AN,它们的笛卡尔积为 A1×A2×…×AN…

    JavaScript 2023年5月28日
    00
  • JavaScript实现继承的4种方法总结

    JavaScript实现继承的4种方法总结 在JavaScript中实现继承有多种方法,常见的有原型链继承、借用构造函数继承、组合继承和寄生组合式继承。下面会一一介绍这些方法。 1. 原型链继承 原型链继承是JavaScript中最常见的继承方式,它的实现方式非常简单。我们可以通过将子类(派生类)的原型对象(prototype)设置为父类(基类)的实例对象,…

    JavaScript 2023年6月11日
    00
  • JavaScript中的作用域链和闭包

    下面为你详细讲解”JavaScript中的作用域链和闭包”。 什么是作用域链? 作用域链定义了变量和函数在定义时能够访问的范围,也即可以被访问的区域。在JavaScript中,函数作用域是唯一的作用域单元。当函数被创建时,它的作用域链是由当前函数的内部作用域和外部函数的作用域链组成的。这个过程会逐级向上找到全局作用域,直至找到全局作用域为止,形成了作用域链。…

    JavaScript 2023年6月10日
    00
  • javascript匿名函数实例分析

    JavaScript匿名函数实例分析 在JavaScript中,函数作为一等公民,被广泛应用于各种场景。函数有两种定义方式:命名函数和匿名函数。本文将详细讲解JavaScript匿名函数的实例分析。 什么是匿名函数? 匿名函数是指没有名称的函数,通常使用匿名函数来进行一些临时的操作。其定义方式如下: (function() { // code here })…

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