js防抖函数和节流函数使用场景和实现区别示例分析

JS防抖函数和节流函数是前端开发中常用的函数优化方法,可以有效提升页面性能和用户体验。它们的使用场景和实现区别如下:

防抖函数

防抖函数的作用是在函数触发频繁的情况下,限制函数执行的次数,确保函数在触发后的一定时间内只执行一次。

使用场景

防抖函数通常用于以下场景:

  • 搜索框输入联想:用户在输入框中快速输入字符时,会触发搜索请求,而防抖函数可以限制请求发送的次数,避免频繁的请求。
  • 按钮提交事件:由于用户可能会多次点击提交按钮,而防抖函数可以确保只有最后一次点击会触发提交事件。

实现方式

使用JavaScript实现防抖函数的代码如下:

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

上述代码实现了一个通用的防抖函数。其中,fn参数是需要处理的函数,delay参数是限制函数执行的时间间隔。函数返回一个闭包,用来保存定时器对象和参数列表。当此函数被执行时,首先清除之前的定时器,然后再设置一个新的定时器,并在一定时间内执行函数。

示例说明

假设我们有一个搜索框输入联想功能,需要尽可能地减少发送网络请求的次数,我们就可以使用防抖函数优化代码:

<input type="text" id="search">
<script>
const searchInput = document.getElementById('search');
const debounceSearch = debounce(() => {
  // 发送搜索请求
}, 300);

searchInput.addEventListener('input', debounceSearch);
</script>

上述代码中,我们为输入框添加了input事件,当用户在输入框中输入字符时,会触发debounceSearch函数。由于debounce()函数的第二个参数是300ms,所以当用户在300ms内持续输入字符时,不会触发搜索请求。等待300ms后,会执行最后一次输入操作所触发的搜索请求。

节流函数

节流函数的作用是在函数持续频繁触发的情况下,限制函数的执行频率,确保函数在一定时间片段内只执行一次。

使用场景

节流函数通常用于以下场景:

  • 页面滚动监听:页面滚动事件会频繁触发,但是实际上只需要显示当前滚动位置附近的内容,而节流函数可以确保滚动事件每隔一定时间片段才触发。
  • 鼠标移动事件:鼠标移动事件同样会频繁触发,而节流函数可以确保每隔一定时间间隔才触发鼠标移动事件。

实现方式

使用JavaScript实现节流函数的代码如下:

function throttle(fn, delay) {
  let last = 0;
  return function(...args) {
    const now = Date.now();
    if (now - last > delay) {
      fn.apply(this, args);
      last = now;
    }
  }
}

上述代码实现了一个通用的节流函数。其中,fn参数是需要处理的函数,delay参数是限制函数执行的时间间隔。函数返回一个闭包,用来保存上一次函数执行的时间戳。当此函数被执行时,如果当前时间和上一次执行时间超过了设定的时间间隔,则执行一次函数,并更新上一次执行时间。

示例说明

假设我们需要在页面滚动时来更新页面标题,但是需要确保标题的更新频率不要太高,我们就可以使用节流函数优化代码:

<h1 id="title">标题</h1>
<script>
const titleElement = document.getElementById('title');
const throttleUpdateTitle = throttle(() => {
  const scrollTop = document.documentElement.scrollTop;
  titleElement.innerText = `当前滚动高度:${scrollTop}px`;
}, 300);

window.addEventListener('scroll', throttleUpdateTitle);
</script>

上述代码中,我们为window对象的scroll事件添加了节流函数throttleUpdateTitle。当用户滚动页面时,会更新标题文字,但是由于节流函数设置的时间间隔为300ms,所以每次滚动事件只有间隔大于300ms时才会更新标题文字。这样可以避免滚动引起的频繁更新,提高页面性能和用户体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js防抖函数和节流函数使用场景和实现区别示例分析 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • ES6解构赋值(数组,对象,函数)使用详解

    ES6 解构赋值详解 在ES6中,解构赋值是一种方便快捷地从数组、对象、函数等中提取数据的方式。解构赋值可以大大简化代码,使其更加具有可读性和易于维护。 数组的解构赋值 在ES6中,我们可以通过数组的解构赋值,方便快捷地将数组的值放入变量中。例如: // ES6数组解构赋值示例 let [x, y] = [1, 2]; console.log(x); // …

    JavaScript 2023年6月10日
    00
  • Javascript之文件操作

    下面是详细讲解JavaScript之文件操作的完整攻略,包括文件的读取、写入、删除等常见操作。 1. 读取文件 1.1 读取本地文件 可以使用FileReader对象读取本地文件。它提供一些方法来读取文件的内容,如readAsArrayBuffer、readAsBinaryString、readAsText、readAsDataURL等。这些方法的参数是一个…

    JavaScript 2023年5月18日
    00
  • Visual Studio中js调试的方法图解

    下面我将详细地讲解“Visual Studio中js调试的方法图解”的完整攻略。 一、Visual Studio中js调试的方法图解 在 Visual Studio 中,开发者可以方便地对 JavaScript 代码进行调试,它提供了丰富的调试工具和应用程序接口。下面是使用 Visual Studio 进行 JavaScript 调试的步骤: 1. 打开一个…

    JavaScript 2023年6月11日
    00
  • 浅谈两种前端截图方式:Canvas截图 vs SVG截图

    背景 如今很多网站都引入截图功能,可用于问题反馈、内容分享等实用需求,而前端截图也不知不觉成为了首选。今天为大家推荐两种前端截图方式,虽然有些局限,但是也能应付大部分项目需求。 Canvas截图:html2canvas SVG截图:rasterizehtml 原理 首先来谈下两种前端截图方式的原理,虽然实现方式不太一致,但是核心思想是相同的。 以html2c…

    JavaScript 2023年4月18日
    00
  • 详解vue中router-link标签所必备了解的属性

    下面我来详细讲解“详解vue中router-link标签所必备了解的属性”。 什么是router-link标签 在Vue中,使用router-link标签可以实现页面的跳转。router-link标签是Vue Router提供的一个组件,它通过Vue Router中的路由规则来控制页面跳转。 router-link标签的必备属性 在使用router-link…

    JavaScript 2023年6月11日
    00
  • 定时器在页面最小化时不执行实现示例

    实现在页面最小化时不执行定时器的方法可以通过两种方式来实现:一种是通过Page Visibility API,另一种是通过requestAnimationFrame()方法。 通过Page Visibility API Page Visibility API可以检测当前页面是否可见,当页面被最小化或者切换到了其他标签页时,document.hidden属性会…

    JavaScript 2023年6月11日
    00
  • JavaScript中类型的强制转换与隐式转换详解

    JavaScript中类型的强制转换与隐式转换详解 JavaScript中的类型转换分为强制转换和隐式转换两种方式,其中强制转换指的是通过代码强制转换变量的数据类型,而隐式转换则是在其他操作中自动进行类型转换。 强制转换 Number() Number()方法可以将其他数据类型转换为数字类型。如果转换结果不符合要求,则会返回NaN(Not-A-Number)…

    JavaScript 2023年6月10日
    00
  • JS中parseInt()和map()用法分析

    JS中parseInt()和map()用法分析 parseInt() parseInt()是一个全局函数,用于解析字符串并返回整数。该函数接受两个参数:要解析的字符串和一个表示解析进制的参数。 parseInt(string, radix) 其中,string是要转换的字符串,radix是一个可选参数,表示要解析的字符串的进制数。 如果省略radix参数,则…

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