js节流函数与防抖函数
防抖函数和节流函数都是为了解决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 throttle(fn, delay) {
let flag = true;
return function () {
let context = this;
let args = arguments;
if (flag) {
flag = false;
setTimeout(function () {
fn.apply(context, args);
flag = true;
}, delay);
}
};
}
三、调用方法
使用防抖函数和节流函数的时候,需要传入两个参数:处理方法和时间间隔。
防抖函数的调用示例:
function handle() {
console.log('handle');
}
let debounceHandle = debounce(handle, 300); // 将原来的处理方法传入防抖函数,并指定时间间隔
element.addEventListener('scroll', debounceHandle); // 将防抖处理方法绑定到事件上
节流函数的调用示例:
function handle() {
console.log('handle');
}
let throttleHandle = throttle(handle, 500); // 将原来的处理方法传入节流函数,并指定时间间隔
element.addEventListener('scroll', throttleHandle); // 将节流处理方法绑定到事件上
本文以监听dom元素的滚动事件为例,先将原始的处理方法 handle 传入防抖或者节流函数,并由新的函数返回。然后将返回的函数作为事件处理方法,并绑定到dom元素上。这样每次触发事件时就会执行防抖或者节流处理方法,从而达到优化性能的目的。
js节流函数与防抖函数的更多相关文章
- js面试题之手写节流函数和防抖函数
函数节流:不断触发一个函数后,执行第一次,只有大于设定的执行周期后才会执行第二次 /* 节流函数:fn:要被节流的函数,delay:规定的时间 */ function throttle(fn,dela ...
- js性能优化之---防抖函数
使用场景 input的时时触发搜索功能 scroll事件的滚动条位置的监测 resize事件监听窗口变化等 举个栗子(input框时时触发搜索功能) 普通未防抖款 var textElement = ...
- js 函数的防抖(debounce)与节流(throttle) 带 插件完整解析版 [helpers.js]
前言: 本人纯小白一个,有很多地方理解的没有各位大牛那么透彻,如有错误,请各位大牛指出斧正!小弟感激不尽. 函数防抖与节流是做什么的?下面进行通俗的讲解. 本文借鉴:h ...
- JS奇淫巧技:防抖函数与节流函数
应用场景 实际工作中,我们经常性的会通过监听某些事件完成对应的需求,比如: 通过监听 scroll 事件,检测滚动位置,根据滚动位置显示返回顶部按钮 通过监听 resize 事件,对某些自适应页面调整 ...
- JS 防抖函数和节流函数
文章转载自:木上有水 什么是防抖?什么是节流? 工作中我们经常会用一些方法监听某些事件的完成,比如scroll.resize.keyup等. 常规事件触发的时候,比如scroll,会在短时间内触发多次 ...
- JS节流和防抖函数
一. 实现一个节流函数 // 思路:在规定时间内只触发一次function throttle (fn, delay) { // 利用闭包保存时间 let prev = Date.now() re ...
- js实现防抖函数和节流函数
防抖函数(debounce) 含义:防抖函数指的是在特定的时间内没有再次触发,才得以进行接下来的函数运行: 用途:当window.onresize不断的调整大小的时候,为了避免不断的重排与重绘,可以用 ...
- js节流与防抖函数封装
js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...
- js 函数的防抖(debounce)与节流(throttle)
原文:函数防抖和节流: 序言: 我们在平时开发的时候,会有很多场景会频繁触发事件,比如说搜索框实时发请求,onmousemove, resize, onscroll等等,有些时候,我们并不能或者不想频 ...
- JavaScript节流与防抖函数封装
js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...
随机推荐
- 插入排序(LOW)
博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def insert_sort(li): for i in range(1, l ...
- Centos双网卡冗余绑定
1. 前言 关于双网卡绑定,前前后后踩过不少的坑,虽然这是 RHCE 中的一道题,但是在实践中碰到问题也够喝一壶的. 在实践中,虚拟机.物理机都做过,但是不尽相同,大部分的坑也集中在这里,本文长期更新 ...
- docker删除所有服务service,停止并删除所有容器container
查看运行容器docker ps 查看所有容器docker ps -a 进入容器其中字符串为容器ID:docker exec -it d27bd3008ad9 /bin/bash 删除所有服务:dock ...
- Docker top 命令
Docker 命令大全Docker 命令大全docker top :查看容器中运行的进程信息,支持 ps 命令参数.语法docker top [OPTIONS] CONTAINER [ps OPTIO ...
- SQL Server 中的异常处理
为什么我们需要 SQL Server 中的异常处理? 让我们通过一个示例来了解 SQL Server 中异常处理的必要性.因此,创建一个 SQL Server 存储过程,通过执行以下查询来除以两个数字 ...
- Pydantic根校验器:构建跨字段验证系统
title: Pydantic根校验器:构建跨字段验证系统 date: 2025/3/24 updated: 2025/3/24 author: cmdragon excerpt: Pydantic根 ...
- 记录一个命令 可以在linux很方便的安装一些软件
小鱼的一键安装系列 wget http://fishros.com/install -O fishros && . fishros 一键安装:ROS(支持ROS和ROS2,树莓派Jet ...
- The surprising impact of mask-head architecture on novel class segmentation精讲
目录 Mask RCNN Problem Definition Key idea Only Mask Head Code Summary Refer 大家好,这是我今天要讲的论文,它是2021年发表在 ...
- 阿里Java开发手册泰山版来袭
阿里Java开发手册自2016年12月7日发布公开版以来,距今已发布7个版本,被越来越多的公司拿来直接或略微修改后作为公司的Java开发规范手册,嫣然成为行业的标杆. 就在昨天早上8点,阿里Java开 ...
- 火焰图(Flame Graph)使用指南
火焰图(Flame Graph) 是一种可视化性能分析工具,可以帮助你快速定位 CPU.内存或 I/O 瓶颈.它看起来像火焰,因此得名. 火焰图能解决什么问题? CPU 占用高:找出哪些函数消耗了最多 ...