这两个概念都是为了解决同一个问题:某些操作触发得太频繁,导致性能浪费甚至页面卡死。
先打个比方
想象你在按电梯按钮:
没有防抖/节流:你疯狂连按100次按钮,电梯就收到100次请求,系统忙疯了。
防抖:不管你按多少次,电梯只在你最后一次按完、安静了几秒后,才执行一次关门动作。
节流:不管你按多少次,电梯每隔固定时间(比如1秒) 最多只响应一次,其余的按了也白按。
防抖(Debounce)
核心思想:等你消停了,我再干活。
每次触发事件时,先等一小会儿。如果在这段时间内又触发了,就重新计时。直到连续一段时间内没有再触发,才真正执行一次。
典型场景:
搜索框输入:用户打字时,不用每敲一个字就发一次请求,而是等用户停下来了再搜索。
窗口 resize:用户拖动窗口大小时,不用每一像素都重新计算布局,等用户拖完松手再处理。
节流(Throttle)
核心思想:不管你怎么折腾,我固定频率干活。
不管事件触发得多频繁,每隔固定时间只执行一次,其余的触发全部忽略。
典型场景:
滚动加载:用户滚动页面时,不用每一毫秒都检查是否到底部,每隔200ms检查一次就够了。
按钮连点:防止用户疯狂点击提交按钮,1秒内只允许提交一次。
一句话总结
防抖:你尽管折腾,等你安静下来我再干活。
节流:你尽管折腾,我按自己的节奏干活。
两者都是为了让程序"别那么累",只是策略不同:防抖追求少干活,节流追求均匀地干活。