JavaScript防抖与节流超详细全面讲解

yizhihongxing

JavaScript防抖与节流超详细全面讲解

一、什么是防抖与节流

防抖(debouncing)节流(throttling)解决的是高频触发事件的性能问题。事件被触发多次,但是实际上我们只需要在事件停止触发之后才进行一次处理,或者减少事件的触发次数。

防抖是指在短时间内多次触发同一个事件,只执行最后一次,或者只在连续触发事件后停止一段时间后再执行。比如在输入框中使用防抖可以减少实时搜索时请求的次数。

节流是指一定时间内只执行一次任务,或者每隔一定时间才执行一次任务。比如页面滚动时加载图片,为了减轻服务器压力,可以将滚动事件改成每200ms执行一次。

二、防抖与节流的实现

1. 防抖的实现

防抖可以使用定时器实现,当事件触发时清除已有的定时器并重新设定一个新的定时器,在一定的时间间隔内没有再次触发事件时,即认为事件停止触发,执行事件处理函数。防抖可以使用JavaScript闭包来实现。

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

//返回一个防抖函数
  return function() {
    let context = this;
    let args = arguments;

    //清除之前的定时器并重新设定一个新的定时器
    clearTimeout(timer);
    timer = setTimeout(function() {
      fn.apply(context, args);
    }, delay);
  };
}

使用示例:

function search(query) {
  console.log(`searching for ${query}`);
}

let debounceSearch = debounce(search, 500);

//实时搜索
let input = document.getElementById('search-input');
input.addEventListener('keyup', function() {
  debounceSearch(input.value);
});

2. 节流的实现

节流可以采用两种方案:使用定时器实现和使用时间戳实现。

使用定时器实现时,当事件触发后设定定时器,在定时器到期后执行事件处理函数,如果在定时器到期之前又触发了事件,则重设定时器,并重新计时。

使用时间戳实现时,当事件触发后,计算距离上次事件的时间是否超过了规定的时间间隔,如果超过了规定的时间间隔,则执行事件处理函数并更新上次事件的时间戳。

下面是使用定时器实现节流的代码:

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

  return function() {
    let context = this;
    let args = arguments;

    //使用定时器实现节流
    if (!timer) {
      timer = setTimeout(function() {
        fn.apply(context, args);
        timer = null;
      }, delay);
    }
  };
}

使用示例:

function loadImage() {
  console.log('loading image');
}

let throttleLoadImage = throttle(loadImage, 200);

window.addEventListener('scroll', throttleLoadImage);

三、防抖与节流的应用场景

1. 防抖的应用场景

实时搜索、拖拽改变窗口大小,网络请求等。

例如实现实时搜索:

function search(query) {
  console.log(`searching for ${query}`);
}

let debounceSearch = debounce(search, 500);

//实时搜索
let input = document.getElementById('search-input');
input.addEventListener('keyup', function() {
  debounceSearch(input.value);
});

2. 节流的应用场景

页面滚动事件、窗口大小改变事件、高频点击事件等。

例如优化窗口大小改变事件:

function resize() {
  console.log('window resized');
}
let throttleResize = throttle(resize, 200);

window.addEventListener('resize', throttleResize);

四、防抖与节流的优缺点

1. 防抖的优缺点

防抖可以减少事件的触发次数,提升性能,但是会延迟事件的实际执行时间。

2. 节流的优缺点

节流可以控制事件的触发间隔,提高性能,但是会影响事件的实际响应时间。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript防抖与节流超详细全面讲解 - Python技术站

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

相关文章

  • JavaScript 版本自动生成文章摘要

    让我来详细讲解一下“JavaScript 版本自动生成文章摘要”的完整攻略。 1.介绍 文章摘要的作用是在文章列表中展示文章的主要内容和吸引读者的注意力。一般情况下,文章摘要是通过手动添加的方式生成的。但是,如果文章太多,手动添加就会变得非常繁琐。所以,我们可以使用JavaScript来自动生成文章摘要。 2.实现步骤 为了自动生成文章摘要,我们需要做以下几…

    JavaScript 2023年5月28日
    00
  • 详解JS数据类型的值拷贝函数(深拷贝)

    以下是详解JS数据类型的值拷贝函数(深拷贝)的攻略: 什么是深拷贝 在 JS 中,我们把变量分为两类:基础类型和引用类型。基本类型的值直接存储在栈(stack)中,而引用类型的值存储在堆(heap)中,变量实际上是一个指针指向对应的地址。因此,基础类型变量的修改不影响其他变量,而引用类型变量的修改会影响所有指向同一地址的变量。而深拷贝就是将原始数据类型和引用…

    JavaScript 2023年6月10日
    00
  • Javascript Global decodeURIComponent() 函数

    以下是关于JavaScript Global对象中decodeURIComponent()函数的完整攻略,包括两个示例说明。 JavaScript Global对象中的decodeURIComponent()函数 JavaScript Global对象中的decodeURIComponent()函数用于解码一个码过的URI组件字符串。URIUniform R…

    JavaScript 2023年5月11日
    00
  • 梳理总结25个JavaScript数组操作方法实例

    首先,我们要对“梳理总结25个JavaScript数组操作方法实例”的主题进行分析和概述,以明确我们需要解决的问题和达成的目标。 主题分析 这个主题的核心是JavaScript数组操作方法的总结和使用,需要概述25个常用的方法,以便读者快速掌握数组操作技巧。我们的目标是提供一份详细的文档,方便读者进行查阅和学习。 操作步骤 为了实现上述目标,我们需要完成以下…

    JavaScript 2023年5月27日
    00
  • javascript实现点击星星小游戏

    实现点击星星小游戏是一项非常有趣的javascript编程任务,下面是一份简单的攻略。 步骤 在HTML页面中创建一个用于放置星星的容器div,并用CSS样式设置其宽度和高度。 <div id="star-container" style="width: 400px; height: 50px;"><…

    JavaScript 2023年6月11日
    00
  • 详解动画插件wow.js的使用方法

    详解动画插件 wow.js 的使用方法 简介 Wow.js 是一款轻量级的 JavaScript 库,可以在网页滚动时为网页元素添加动画效果。这个库的优点是易于集成,使用简单,而且具有可自定义的选项。 安装 Wow.js 依赖于 Animate.css 库,所以它需要先引入 Animate.css。通过 CDN 或者下载到本地都可以。 然后,下载或者通过 C…

    JavaScript 2023年6月10日
    00
  • html5 web本地存储将取代我们的cookie

    HTML5 Web本地存储指的是一种在客户端(浏览器)端进行数据存储的技术。它主要通过Web Storage API和IndexedDB API来实现。 与传统的Cookie相比,Web本地存储有诸多优点。例如,Web本地存储提供了比Cookie更大的存储空间,并且数据存储在本地,不需要每次请求都带上一份数据,从而减少了网络流量。 以下是使用Web本地存储来…

    JavaScript 2023年6月11日
    00
  • 事件绑定之小测试 onclick && addEventListener

    事件绑定是 Web 开发中常用的技术。在 JavaScript 中,有多种方法可以实现事件绑定,其中包括 onclick 和 addEventListener。本文将介绍 onclick 和 addEventListener 的使用方法以及他们之间的区别,同时提供了两个示例,以帮助读者更好地理解事件绑定。 onclick onclick 是 JavaScri…

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