JavaScript函数防抖与函数节流的定义及使用详解

yizhihongxing

JavaScript函数防抖与函数节流的定义及使用详解

函数防抖和函数节流是 JavaScript 常用的两种优化方案。它们可以延迟函数的执行,减少频繁请求和高频事件造成的性能问题。

一、函数防抖

在 JavaScript 中,如果频繁触发某个事件,比如输入框输入,鼠标滚动等,可能会造成函数频繁执行,影响性能。而使用函数防抖可以延迟函数的执行,只有等到一段时间内没有触发事件后才会执行函数。函数防抖的概念可以理解为:多次触发事件后,事件处理函数只执行一次,并且是在触发操作后一段时间(例如2秒)才执行,如果在这个时间内再次触发事件,则重新计算时间。

1. 函数防抖的基本实现

function debounce(fn, delay) {
  let timer = null;
  return function() {
    let args = arguments;
    let that = this;
    timer && clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(that, args);
    }, delay || 500);
  }
}

函数接受两个参数:要执行的函数和延迟时间。返回一个新的函数,这个函数利用了闭包的特性,保存了timer对象,保证了每次调用函数时都是同一个timer。接着调用 setTimeout 设置延时执行函数,如果在延时期间又执行了一次函数,则清空之前的计时器,重新开始计时。

2. 函数防抖的应用

例如,我们要监听一个输入框的变化,根据用户输入的内容进行搜索:

<input type="text" id="searchInput">
const searchInput = document.querySelector('#searchInput');

function search() {
  console.log(searchInput.value);
  // 进行搜索操作
}

searchInput.addEventListener('input', debounce(search, 500));

上面的代码中,我们给输入框添加了 input 事件监听器,并且使用 debounce 函数将 search 函数进行了防抖处理,延迟 500ms 执行搜索操作。

二、函数节流

函数防抖在某个时间段内只会执行一次函数,而函数节流会让函数按照一定的时间间隔执行。函数节流的概念可以理解为:高频触发事件,但在n秒内,只会执行一次函数。

1. 函数节流的基本实现

function throttle(fn, delay) {
  let timer = null;
  let lastTime = 0;
  return function() {
    let args = arguments;
    let that = this;
    let nowTime = new Date().getTime();
    if(nowTime - lastTime > delay || !lastTime) {
      timer && clearTimeout(timer);
      lastTime = nowTime;
      timer = setTimeout(function(){
        fn.apply(that, args);
      }, delay || 500);
    }
  }
}

函数节流的实现也是利用闭包保存了 timer 和 lastTime,在函数内部进行计算判断是否达到了时间间隔,在间隔达到时执行目标函数,否则不做任何操作。

2. 函数节流的应用

同样以监听输入框为例:

searchInput.addEventListener('input', throttle(search, 500));

使用 throttle 函数对 search 函数进行节流,每 500ms 执行搜索操作。

总结

函数防抖和函数节流可以有效地减少高频事件的触发次数,优化性能,提高用户体验。在实际开发中,我们需要根据场景进行选择合适的使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript函数防抖与函数节流的定义及使用详解 - Python技术站

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

相关文章

  • 浅谈JS读取DOM对象(标签)的自定义属性

    一、什么是DOM对象自定义属性 在HTML标签中,我们可以自定义属性,比如:<div data-id=”123″>自定义属性</div>,这里的data-id即为自定义属性。 在JavaScript中,我们可以通过DOM对象的dataset属性来读取自定义属性的值。 二、JS读取DOM对象(标签)的自定义属性 1.读取单个DOM对象的…

    JavaScript 2023年6月10日
    00
  • JS 密码强度校验的正则表达式(简单且好用)

    下面是详细讲解“JS 密码强度校验的正则表达式(简单且好用)”的完整攻略。 1. 背景和需求 现在几乎所有的网站都需要用户进行注册和登录操作,为了保障用户账号的安全,往往都需要在密码设置时进行一定的限制和校验,例如要求密码长度不少于6位,必须包含数字、字母和特殊字符等。 这时候,就可以使用正则表达式来进行密码强度的校验。而在实际应用中,可以针对不同的强度要求…

    JavaScript 2023年6月10日
    00
  • JS实战例子之实现自动打字机动效

    下面是JS实战例子之实现自动打字机动效的完整攻略。 简介 实现自动打字机动效的核心是要让文字逐字逐句显示。这个效果可以通过JS动态改变文字的内容和样式来实现。主要步骤包括: 编写html和css样式; 在JS中获取要显示的文字并逐字逐句显示。 下面我们详细讲解这两个步骤。 编写html和css样式 首先,在html中放置一段要显示的文字,例如: <p …

    JavaScript 2023年5月28日
    00
  • 用正则表达式 动态创建/增加css style script 兼容IE firefox

    动态创建或增加 CSS 和 JS 很常见,特别是要在特定条件下加载代码时。一种常用的方式是使用 JavaScript 和 DOM 操作来实现这个功能,但使用正则表达式来完成这个任务也是一种更加高效、可靠和优雅的方法。 以下是使用正则表达式动态创建/增加 CSS 和 JavaScript 的完整攻略: 用正则表达式动态添加 CSS 动态添加 CSS 通常是为了…

    JavaScript 2023年6月10日
    00
  • 实例讲解使用原生JavaScript处理AJAX请求的方法

    处理AJAX请求是现代Web开发中非常重要的一部分,可以轻松地从服务器加载数据并进行无需刷新页面的动态更新。原生JavaScript提供了一些内置的方法,可用于处理AJAX请求,并通过JavaScript代码与其他服务端技术交互。 以下是使用原生JavaScript处理AJAX请求的方法的完整攻略: 步骤一:创建XMLHttpRequest对象 XMLHtt…

    JavaScript 2023年6月11日
    00
  • window.parent与window.openner区别介绍

    window.parent与window.opener区别介绍 在网页中经常出现需要进行页面跳转的情况,比如新窗口打开链接,或者在iframe中嵌入其他网页。在JavaScript中有两个常用的属性可用于控制页面跳转:window.parent和window.opener。在本文中,将详细介绍这两个属性的区别以及其应用场景。 window.parent wi…

    JavaScript 2023年6月11日
    00
  • JavaScript基础语法、dom操作树及document对象

    JavaScript是一种脚本语言,可以使网页变得更动态和交互性。要学好JavaScript,需要掌握其基础语法、dom操作树及document对象。以下是详细的攻略: JavaScript基础语法 JavaScript注重代码的可读性和清晰度。在学习JavaScript的基础语法时,需要注意以下内容: 注释 在代码中添加注释,可以让其他人更易于理解你的代码…

    JavaScript 2023年5月27日
    00
  • 常用的JS验证和函数汇总

    下面是有关“常用的JS验证和函数汇总”的详细讲解: 常用的JS验证和函数汇总 一、JS验证错误提示 在进行表单验证时,我们需要考虑到用户的体验感觉,如果用户输入的内容有误,我们需要对用户进行友好的提示,这样可以避免用户产生不必要的焦虑或者反感。 下面是一个JS验证错误提示的示例: function checkForm() { var name = docum…

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