掌握前端性能优化的秘密武器:深入解析JavaScript节流技术

前言

在上一篇文章中我们讲到了防抖函数,这是一个在开发中十分常见且重要的函数。这一次我们要开始讲它另一个好伙伴------节流

什么是节流?

节流是一种前端优化技术,用于控制函数在一定时间内被调用的频率,确保函数不会以超过指定的时间间隔过快地连续调用。节流的目的是减少函数执行的频率,避免过于频繁的操作导致性能问题。

节流的应用场景

滚动事件处理:在处理滚动事件时,防止因为用户快速滚动而导致事件处理函数过于频繁地执行。

窗口大小调整:当用户调整浏览器窗口大小时,限制事件处理函数的执行频率,确保在一定时间内只执行一次。

输入框输入:在处理输入框输入事件时,避免每次按键都触发处理函数,而是在用户停止输入一段时间后再执行。

如何实现节流

下面我们来通过案例分析:

js 复制代码
// 获取id为'btn'的按钮元素
let btn = document.getElementById('btn');
// 定义一个函数 send,用于模拟提交操作
function send() {
    console.log('提交了');
}
// 通过事件监听给按钮添加点击事件,使用节流函数 throttle 包装 send 函数
btn.addEventListener('click', throttle(send, 1000));
// 定义节流函数 throttle
function throttle(fn, delay) {
// 使用 Date.now() 获取当前时间戳,将其赋给 prevTime
    let prevTime = Date.now();
    return function () {
        if (Date.now() - prevTime > delay) {
            fn.apply(this, arguments);
            prevTime = Date.now();
        }
    };
}

我们来分析这个案例中的代码:

js 复制代码
btn.addEventListener('click', throttle(send, 1000));

使用addEventListener给按钮添加了一个点击事件监听器。当按钮被点击时,调用throttle函数,将send函数和节流的延迟时间(1000毫秒)作为参数传入。

js 复制代码
    let prevTime = Date.now(); 

使用Date.now()获取当前时间戳,将其赋给prevTime。这个变量用于追踪上一次节流函数调用的时间。

js 复制代码
function throttle(fn, delay) {
// 使用 Date.now() 获取当前时间戳,将其赋给 prevTime
    return function () {
        if (Date.now() - prevTime > delay) {
            fn.apply(this, arguments);
            prevTime = Date.now();
        }
    };
}

在返回的函数内部,它检查自上一次调用prevTime以来经过的时间是否大于指定的delay。如果是,就使用 fn.apply(this, arguments)调用原函数fn,并更新prevTime为当前时间戳。

节流的工作流程

1.初始化:在节流函数被调用时,初始化一个变量prevTime为当前时间戳,用于追踪上一次函数调用的时间。

2.时间间隔检查:计算当前时间与上一次函数调用的时间间隔:Date.now() - prevTime

3.判断是否执行原函数:如果时间间隔大于等于设定的延迟时间(delay),则执行原函数。如果时间间隔小于延迟时间,忽略这次调用,不执行原函数。

4.更新时间戳:如果原函数被执行,更新prevTime为当前时间戳,表示这次函数调用的时间。

总结

虽然节流函数让我们在开发中更加方便,但是它也有一些不足,比如如果在两次触发之间的时间间隔内频繁触发事件,可能会导致一些事件被丢失。

感谢您的阅读,点赞关注作者更新更多后续

相关推荐
TeleostNaCl11 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫13 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友13 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理15 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design
毕设十刻15 小时前
基于Vue的学分预警系统98k51(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
mapbar_front16 小时前
在职场生存中如何做个不好惹的人
前端
牧杉-惊蛰16 小时前
纯flex布局来写瀑布流
前端·javascript·css
一袋米扛几楼9817 小时前
【软件安全】什么是XSS(Cross-Site Scripting,跨站脚本)?
前端·安全·xss
向上的车轮17 小时前
Actix Web适合什么类型的Web应用?可以部署 Java 或 .NET 的应用程序?
java·前端·rust·.net
XiaoYu200217 小时前
第1章 核心竞争力和职业规划
前端·面试·程序员