JavaScript函数节流和函数防抖之间的区别

JavaScript函数节流和函数防抖是前端开发中常用的优化技巧,本文将对这两种技巧进行详细讲解,并且给出具体的示例说明。

什么是函数节流?

函数节流是指在一定时间内,无论事件被触发了多少次,都只会执行一次函数。常见的应用场景包括:

  • 滚动加载页面时,用户快速滑动页面,避免频繁触发事件,降低页面性能。
  • 窗口大小改变时,频繁触发事件,限制事件触发次数,保证事件响应的流畅性。

函数节流的实现通常采用定时器的方式,用一个变量记录上次执行的时间戳,然后在每次执行时判断当前时间是否超过规定时间间隔。

下面是一个函数节流的例子,实现当用户快速滚动页面时,图片懒加载仍能同时运行,但不会过度消耗浏览器性能:

function throttle(func, delay) {
  let prev = Date.now();
  return function() {
    const context = this;
    const args = arguments;
    const now = Date.now();
    if (now - prev >= delay) {
      func.apply(context, args);
      prev = Date.now();
    }
  }
}

function lazyLoadImg() {
  // code
}

window.addEventListener('scroll', throttle(lazyLoadImg, 300));

什么是函数防抖?

函数防抖的作用是在一定时间内,对于连续触发的事件,只执行一次函数。使用场景包括:

  • 搜索框实时搜索时,用户连续输入字符,减少请求次数,避免服务器负荷过大。
  • 窗口大小改变时,连续触发resize事件,但只有在停止改变大小时才执行事件响应。

函数防抖的实现也可以采用定时器的方式,用一个变量记录上次执行的时间戳。在规定时间间隔内,如果再次触发事件,就将上次的定时器清空,重新设置定时器。

下面是一个函数防抖的例子,实现当用户连续输入时,延迟一定时间再执行搜索:

function debounce(func, delay) {
  let timerId;
  return function() {
    const context = this;
    const args = arguments;
    if (timerId) clearTimeout(timerId);
    timerId = setTimeout(() => {
      func.apply(context, args);
    }, delay)
  }
}

function search() {
  // code
}

const searchBar = document.querySelector('#search-bar');
searchBar.addEventListener('input', debounce(search, 300));

总结

函数节流和函数防抖都是优化前端性能的有用技巧。函数节流用于限制事件触发次数,适合滚动,拖拽等场景;函数防抖用于连续多次触发事件时,减少不必要的处理,适合输入框搜索等场景。了解这两种优化技巧,可以更好地掌握前端性能优化的策略。

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

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

相关文章

  • JavaScript中定义函数的三种方法

    在JavaScript中,定义函数有三种方法,分别是函数声明、函数表达式和箭头函数。 函数声明 函数声明是最常见的定义函数的方法,格式如下: function functionName(parameters) { // 函数体 } 其中,functionName为函数的名称,parameters为函数所需的参数,函数体中包含执行的代码。例如: functio…

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

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

    JavaScript 2023年6月11日
    00
  • JS求Number类型数组中最大元素方法

    下面是“JS求Number类型数组中最大元素方法”的完整攻略: 方法一:使用Math.max()函数 我们可以直接使用JavaScript内置的Math.max()函数来求一个数组中的最大元素。但要注意的是,Math.max()函数无法直接传入一个数组,需要借助apply()函数将数组作为参数传入Math.max()。 代码如下: const arr = […

    JavaScript 2023年6月10日
    00
  • JavaScript使用encodeURI()和decodeURI()获取字符串值的方法

    JavaScript使用encodeURI()和decodeURI()获取字符串值的方法 在JavaScript中,有时候需要将字符串数据转换成URI格式,或者从URI格式中获取字符串数据。这时候可以使用encodeURI()和decodeURI()方法来完成转换。 encodeURI() encodeURI()方法将字符串数据作为URI进行编码,其中一些字…

    JavaScript 2023年5月19日
    00
  • asp.net使用JS+form表单Post和Get方式提交数据

    接下来我将为您详细讲解“asp.net使用JS+form表单Post和Get方式提交数据”的完整攻略。ASP.NET 是一种基于 Web 的框架,它允许开发者使用各种编程语言(如 C#、Visual Basic、JavaScript 和 Python 等)来构建 Web 应用程序。ASP.NET 使用 HTML、CSS 和 JavaScript 技术实现 W…

    JavaScript 2023年6月10日
    00
  • Ajax入门学习教程(一)

    这里是Ajax入门学习教程(一)的详细攻略: 一、什么是Ajax Ajax(Asynchronous JavaScript and XML)指的是一种在Web应用中创建交互式的、快速动态的用户体验的技术。通过Ajax,你可以使用JavaScript向服务器异步发出请求,获取数据,然后将这些数据呈现在页面上。 二、Ajax实现步骤 实现Ajax主要有以下步骤:…

    JavaScript 2023年6月11日
    00
  • 解析Javascript设计模式Revealing Module 揭示模式单例模式

    解析Javascript设计模式- 模块(Module)设计模式 什么是设计模式? 设计模式是指在软件开发过程中,经过实践和总结得出的一些针对重复出现问题的通用解决方案。 模块(Module)设计模式 在Javascript中通过函数的作用域和闭包来实现模块化,这是Javascript编程中比较常用的设计模式。通过将私有变量和私有函数作为函数的局部变量和局部…

    JavaScript 2023年6月10日
    00
  • JS实现的自动打字效果示例

    接下来我将为你讲解“JS实现的自动打字效果示例”的完整攻略。 这是一个比较常见的网页效果,可以使用 JavaScript 来实现。整个过程大体可分为以下几个步骤: 步骤一:准备 HTML 结构 首先,你需要准备一个包含文字内容的 HTML 元素,例如: <div id="text"> <p>这是一段文本内容,我们将…

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