花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 23|回复: 2

JS节流基础版

[复制链接]
  • TA的每日心情
    奋斗
    2026-6-25 12:08
  • 签到天数: 1854 天

    [LV.Master]伴坛终老

    3262

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-6-25 12:11 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    什么是节流?

    节流(Throttle)是一种限制高频事件触发频率的性能优化技术,确保函数在固定时间间隔内最多执行一次,相当于给函数加了“冷却时间”。常用于 scroll、resize、mousemove、keydown 等高频事件,避免页面卡顿和性能浪费。

    先来体会高频事件的例子。下例,鼠标指针在方框内移动时会实时触发计数器函数的累加运算,计数结果高频率呈现在方框内,预览过程中请尝试将鼠标指针不停地在方框内绕圈移动,这时可以看到数字的变化速度非常之快:

    <style>
        #mdiv { margin: auto; padding: 12px; width: 400px; height: 200px; display: grid; place-items: center; font-size: 36px; border: 1px solid gray; }
        .tMid { text-align: center; }
    </style>
    
    <h1 class="tMid">请在方框内移动鼠标指针</h1>
    <div id="mdiv">0</div>
    
    <script>
        let num = 0;
        const add = () => ++num; // 累加器
        const showRes = () => mdiv.innerText = add(); // 显示计数器结果
        mdiv.addEventListener('mousemove', showRes, 500);
    </script>
        

    mousemove 是鼠标指针移动事件,当它移动于特定元素之上,待运行的机制会被高频率触,不加以节流可能产生非预期的效果甚至造成一些负面影响。要改变上例计数变化过快的效果,实现方法之一是给其降频,通过“节流”的机制让目标函数在一定时间间隔内只能运行一次。节流好比特定线路的公交车,在规定的事件间隔必定有一辆车子开出;或者也可以比喻为给花圃自动浇水的设备,令设备每隔一段时间自动喷水一次。

    以下例子采用了通用的节流函数,该函数在 mouseover 监听事件中调用,作用于调用计数器并呈现计数结果的 showRes 函数,即每隔指定时间(wait毫秒)运行一次 showRes 函数(而 showRes 函数调用的时累加器函数):

    <style>
        #mdiv { margin: auto; padding: 12px; width: 400px; height: 200px; display: grid; place-items: center; font-size: 36px; border: 1px solid gray; }
        .tMid { text-align: center; }
    </style>
    
    <h1 class="tMid">请在方框内移动鼠标指针</h1>
    <div id="mdiv">0</div>
    
    <script>
        let num = 0;
    
        // 函数 :累加器
        const add = () => ++num; 
    
        // 函数 :显示累加器当前运算结果
        const showRes = () => mdiv.innerText = add();
        
        // 函数 :节流(时间戳版)
        const throttle = (func, wait) => {
            let last = 0; // 上一次的时间戳
            return (...args) => {
                let now = Date.now(); // 当下的时间戳
                if (now - last >= wait) {
                    func.apply(this, ...args); // 执行传入的目标函数
                    last = now; // 重置时间戳
                }
            };
        };
    
        mdiv.addEventListener('mousemove', throttle(showRes, 500));
    </script>
        

    节流函数还有另一个版本,计时器版,通用函数如下:

    // 节流 :定时器版
    const throttle = (func, wait) => {
        let timeout;
        return (...args) => {
            if (timeout) return; // 冷却机制(如果计时器存在不执行下面的代码)
            // 启动计时器
            timeout = setTimeout(() => {
                timeout = null; // 注销计时器以便后续重置
                func.apply(this, ...args); // 应用函数
            }, wait);
        };
    };
        

    定时器版(setTimeout)节流函数完全可以替代前例的时间戳版(Date.now)函数,效果一样。

    节流与防抖都是降频处理高频事件,二者的核心区别在于:节流是在匀速执行目标函数,防抖则是延时执行目标函数——好比电梯的自动关门机制那样,只要还有人进电梯,所指定的间隔时间马上重置,即重新开始倒计时。

    【说明】本文所讨论的节流函数属于基础班、简化版、通用版,它们还有多种演进版本,感兴趣的朋友可以网查。

    评分

    参与人数 1威望 +30 金钱 +60 经验 +30 收起 理由
    梦江南 + 30 + 60 + 30 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    开心
    2026-6-25 10:02
  • 签到天数: 760 天

    [LV.10]以坛为家III

    538

    主题

    2万

    回帖

    7万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师天籁妙音共看流星风雨同行我心永远喜乐安康花潮贵宾

    发表于 2026-6-25 12:19 | 显示全部楼层
    报告黑黑老师,预览都试过了,一快一慢,这种现象就是老师说的“节流”?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2026-6-25 10:02
  • 签到天数: 760 天

    [LV.10]以坛为家III

    538

    主题

    2万

    回帖

    7万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师天籁妙音共看流星风雨同行我心永远喜乐安康花潮贵宾

    发表于 2026-6-25 12:19 | 显示全部楼层
    谢谢黑黑老师辛苦,学习了。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-6-25 18:27 , Processed in 0.068766 second(s), 25 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表