一文教你彻底学会JavaScript手写防抖节流

yizhihongxing

一文教你彻底学会JavaScript手写防抖节流

什么是防抖和节流

在介绍手写防抖节流之前,先来了解一下防抖和节流的概念:

  • 防抖:指在短时间内多次触发同一个事件,只执行最后一次,或者只在开始时执行一次。
  • 节流:指连续触发事件但是在 n 秒中只执行一次函数。即在某个时间段内,无论触发多少次事件,都只执行一次函数。

防抖和节流可以用来解决频繁触发的问题,避免资源的浪费和性能的下降。在实际开发中经常用来处理滚动、输入等频繁触发的事件。

手写防抖

实现防抖函数的常见方法是利用 setTimeout 设置延迟执行,若延迟期间该函数再次被触发,则清除之前的延迟定时器再重新延迟,直到延迟结束执行函数。

手写防抖函数的代码示例:

function debounce(fn, delay) {
  let timer = null;

  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn.apply(this, arguments);
    }, delay);
  };
}

该函数接收两个参数:

  • fn,要执行的函数;
  • delay,延迟时间间隔。

该函数返回一个新的函数,执行它相当于执行 fn 函数,但执行时已经加了防抖的限制。

手写节流

实现节流函数的常见方法是用时间戳 last 记录上一次的执行时间,每次触发时判断距离上一次执行的时间是否大于函数执行的间隔时间 wait,若大于则执行函数。

手写节流函数的代码示例:

function throttle(fn, wait) {
  let last = 0;

  return function() {
    const now = Date.now();

    if (now - last > wait) {
      fn.apply(this, arguments);
      last = now;
    }
  };
}

该函数接收两个参数:

  • fn,要执行的函数;
  • wait,执行间隔时间。

该函数返回一个新的函数,执行它相当于执行 fn 函数,但执行时已经加了节流的限制。

结语

防抖和节流是 JavaScript 中非常实用的两个功能,掌握它们能够帮助我们更好地处理一些特殊的事件,避免资源的浪费和性能的下降。这里给出了手写防抖节流的代码示例, 真实项目中可以根据实际需要进行调整。

示例1: 手写防抖实现表单输入验证

const input = document.querySelector('#input');
const error = document.querySelector('#error');

// 实现表单输入防抖验证(间隔500ms)
const validateInput = debounce(function(e) {
  const value = e.target.value;
  if (value.length < 6) {
    error.style.display = 'block';
  } else {
    error.style.display = 'none';
  }
}, 500);

input.addEventListener('input', validateInput);

示例2: 手写节流实现下拉刷新

function onScroll() {
  console.log('滚动事件');
}

// 实现下拉刷新节流(间隔500ms)
const onThrottleScroll = throttle(onScroll, 500);

window.addEventListener('scroll', onThrottleScroll);

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文教你彻底学会JavaScript手写防抖节流 - Python技术站

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

相关文章

  • js使用i18n实现页面国际化的方法

    实现页面国际化(Internationalization,简称i18n)的方法在前端开发中非常常见,可以让我们的网站更易于被全球用户理解和使用。下面我将详细讲解如何使用JavaScript实现网站的i18n。 1. 建立语言包 首先,我们需要建立站点所需的多语言文字资源。针对不同语言,我们可以分别建立不同的语言包(language pack),其中保存着相应…

    JavaScript 2023年5月19日
    00
  • javascript实现实时输出当前的时间

    下面是详细讲解如何用JavaScript实现实时输出当前时间的攻略。 步骤一:获取当前时间 JavaScript内置了Date对象,可以通过该对象的各种方法获取当前系统时间。其中,可以使用new Date()方法创建一个Date对象,该对象可以返回包含当前日期和时间的Date对象。例如: let now = new Date(); 这将创建一个表示当前日期和…

    JavaScript 2023年5月27日
    00
  • 一个类似vbscript的round函数的javascript函数

    首先,我们需要明确需求:编写一个类似于VBScript中Rount函数的JavaScript函数。Round函数的作用是将一个数值四舍五入到指定的位数。 以下是JavaScript版本的Round函数的完整示例实现: // 自定义Round函数,用于四舍五入保留指定位数的数字 function round(number, precision) { var f…

    JavaScript 2023年6月10日
    00
  • JS获取时间的相关函数及时间戳与时间日期之间的转换

    获取时间的相关函数及时间戳与时间日期之间的转换 在JavaScript中,获取时间的方法非常多,包括获取时间戳、获取当前日期时间等。下面我们来依次介绍这些函数。 1.获取时间戳: 时间戳指的是距离1970年1月1日0时0分0秒(UTC时间)的时间差,单位为毫秒。获取时间戳有两种方式: (1) Date.now() 函数 这个函数返回当前时间的时间戳,它等价于…

    JavaScript 2023年5月27日
    00
  • ES7中await如何优雅的捕获异常详解

    下面是ES7中await如何优雅的捕获异常的完整攻略。 ES7中await如何优雅的捕获异常详解 前言 在ES7(ES2016)中,我们使用async/await语法来处理异步操作是非常方便的。然而,await在处理过程中可能会抛出异常,这时我们需要用到try…catch语句来捕获异常并进行处理。 捕获异常的传统方法 在ES6及之前的版本中,我们通常是这…

    JavaScript 2023年5月28日
    00
  • Javascript新手入门之字符串拼接与变量的应用

    Javascript中字符串拼接与变量的应用是初学者入门时需要掌握的重要内容,本文将详细讲解其攻略。首先,我们需要理解什么是字符串和变量。 字符串和变量 字符串 字符串是指在双引号或单引号中包含的一组字符。例如: var str = "hello javascript"; console.log(str); 上面这段代码声明了一个字符串类…

    JavaScript 2023年5月28日
    00
  • 跨站攻击之实现Http会话劫持的手法

    跨站攻击(Cross-Site Attack)又称为XSS攻击,是指攻击者在网页中插入恶意脚本,使受害者在访问网页时,网页中的恶意脚本被执行从而攻击受害者。跨站攻击有很多种形式,其中之一就是Http会话劫持,下面我们来看看这种手法的攻略。 什么是Http会话劫持 Http会话劫持是指攻击者在网站上注入一段代码,通过劫持用户已经建立的会话从而获取用户的权限、获…

    JavaScript 2023年6月11日
    00
  • JavaScript函数中this指向问题详解

    下面就为您详细讲解“JavaScript函数中this指向问题详解”的完整攻略。 JavaScript函数中this指向问题详解 在JavaScript中,函数的this指向经常导致开发人员困惑。本文将详细介绍JavaScript中函数的this指向问题。了解这些概念和最佳实践有助于轻松编写高效的JavaScript代码。 什么是this? 在JavaScr…

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