前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JS 性能优化之节流

JS 性能优化之节流

作者头像
很酷的站长
发布2022-12-06 15:50:07
1.2K0
发布2022-12-06 15:50:07
举报
JS 性能优化之节流
JS 性能优化之节流
1. 节流介绍

节流: n 秒内只运行一次,若在 n 秒内重复触发,只有第一次生效

节流的应用场景:

1. 滚动加载: 监听页面滚动到底部的时候触发 2. 拖拽场景: 固定时间只执行一次,防止高频率的位置变动

2. 滚动加载-节流处理

首先编写监听页面滚动距离的方法,当向下滑动时,可以看到控制台执行了很多次的输出,如果我们要根据页面滑动距离来计算代码逻辑,这样频繁的执行计算会非常损耗系统性能,我们可以使用节流来优化这个问题

代码语言:javascript
复制
<style>
    body {
        height: 2000px;
        background: lightsalmon;
    }
</style>
<script>
    let count = 1
    function scrollFn() {
        console.log('监听页面滚动次数: ', count++);
    }
    document.onscroll = scrollFn
</script>

节流的实现思路:

1. 借助 setTimeout 定时器,控制事件回调是否执行 2. 获取每次事件执行的时间与上一次执行的时间差 3. 判断时间差是否已超过设定的时间间隔,超过时立即执行函数,没有超过时取消后续的定时器任务 4. 最后一次事件的触发,会执行完成

使用节流函数优化后的代码:

源码下载站

代码语言:javascript
复制
// 节流函数
function throttle(fn, time) {
// 上一次的执行时间
let pre = 0
let timeout = null
return function (...args) {
const now = Date.now()
// 时间差超过了设定的时间间隔
if (now - pre > time) {
pre = now
fn.apply(this, args)
} else {
// 没有超过设定的时间间隔,则后续的事件会直接清除
if (timeout) {
clearTimeout(timeout)
timeout = null
}
// 最后一次的事件会触发
timeout = setTimeout(() => {
pre = now
fn.apply(this, args)
}, time);
}
}
}
document.onscroll = throttle(scrollFn, 300)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 节流介绍
  • 2. 滚动加载-节流处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档