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 事件: 防抖 定义:多次触发事 ...
随机推荐
- 华为平板+Zotero+Xodo+坚果云+Zotfile+Zotero OCR,实现论文笔记平板手写+Win自动生成,补充官方教程
需要的硬件,软件,插件和实现的最终效果,rt. 1. Win,下载Zotero,坚果云 下载网址:https://www.zotero.org/download/ 版本:Zotero 6.如果是其他版 ...
- python list 差集
前言 有时候我们希望基于list得到一个集合C,该集合C的元素可以被描述为元素在集合A中而不在集合B中.即:差集. 基于set A = [1, 2, 3] B = [2, 3, 4] C = set( ...
- jquery给一个li标签添加和去掉class属性
$("li").addClass('xxx').siblings().removeClass("xxx");
- CMake简单学习
CMake 说明 cmake的定义是什么 ?-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----C ...
- BUUCTF---RSA4
题目 点击查看代码 N = 33131032421200003002021431224423222240014241042341310444114020300324300210433321420203 ...
- BUUCTF---Cipher1(playfair)
playfair Playfair密码原理以及该题解题步骤 Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Char ...
- sulime设置备份
{ "color_scheme": "Packages/Color Scheme - Default/Monokai.sublime-color-scheme" ...
- 【Legged gym】关于Legged gym用到的roll_out_storages的batch的解析和一些PPO算法层面.config文件里参数的说明
1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流. 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.1 yield 最开始发现于:rollout_stor ...
- .net WorkFlow 流程介绍
WikeFlow官网:www.wikesoft.com WikeFlow学习版演示地址:workflow.wikesoft.com WikeFlow学习版源代码下载:https://gitee.com ...
- QT 的信号-槽机制
对于对象间的通信问题,很多框架采用回调函数类解决.QT 使用信号-槽解决对象间的通信问题,只要继承 QObject 类就可以使用信号-槽机制.信号-槽使用起来非常简单.灵活,发射和接收对象实现了解耦. ...