在前端开发中,常常会用到例如scroll、mousemove等持续触发的事件,这样的事件引起的操作有可能会导致页面卡顿,我们希望这样的事件不要频繁的触发执行回调。
防抖和节流是前端性能优化的两种方式。
- 相同点:将频繁的回调函数进行次数缩减,避免大量计算导致页面卡顿
- 不同点:防抖是将多次执行变为一次执行;节流是将多次执行变为在规定时间内只执行最后一次。比如在页面的无限加载场景下,我们需要用户在滚动页面时,每隔一段时间发一次 Ajax 请求,而不是在用户停下滚动页面操作时才去请求数据。这样的场景,就适合用节流技术来实现。
防抖
1、定义:事件触发后在规定时间内,回调函数只能执行一次,如果在规定时间内又触发了该事件,则会重新开始计算规定时间。
2、原理:通过定时器将回调函数进行延时,如果在规定时间内继续回调,发现存在之前的定时器,则将该定时器清除,并重新设置定时器。这就要求后面所有的回调函数都要能访问到之前设置的定时器,此时需用到闭包。
3、应用:搜索框输入查询,如果用户一直输入则没有必要不停地请求,如果用户停止输入并过了规定时间间隔,再进行查询;按钮点击的事件;表单验证;浏览器窗口缩放停止后计算布局等的操作。
//fn指回调函数,delay指延迟时间,immediate指是否立即执行
function debounce(fn, delay,immediate) {
var timer =