目的
以下场景往往由于事件频繁被触发,因而频繁执行DOM操作、资源加载等重行为,导致UI停顿甚至浏览器崩溃。
window对象的resize、scroll事件- 拖拽时的
mousemove事件 - 射击游戏中的
mousedown、keydown事件 - 文字输入、自动完成的
keyup事件
实际上对于window的resize事件,实际需求大多为停止改变大小n毫秒后执行后续处理;而其他事件大多的需求是以一定的频率执行后续处理。针对这两种需求就出现了debounce和throttle两种解决办法。
throttle(又称节流)和debounce(又称去抖)其实都是函数调用频率的控制器,
debounce去抖
当调用函数n秒后,才会执行该动作,若在这n秒内又调用该函数则将取消前一次并重新计算执行时间,举个简单的例子,我们要根据用户输入做suggest,每当用户按下键盘的时候都可以取消前一次,并且只关心最后一次输入的时间就行了。
throttle节流
throttle将一个函数的调用频率限制在一定阈值内,例如1s内一个函数不能被调用两次。
vue中节流防抖封装
// 防抖
export function _debounce(fn, d) {
var delay = d || 600;
var timer;
return function() {
var th = this;
var args = arguments;
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(function() {
timer = null;
fn.apply(th, args);
}, delay);
};
}
// 节流
export function _throttle(fn, d) {
var last;
var timer;
var interval = d || 600;
return function() {
var th = this;
var args = arguments;
var now = +new Date();
if (last && now - last < interval) {
clearTimeout(timer);
timer = setTimeout(function() {
last = now;
fn.apply(th, args);
}, interval);
} else {
last = now;
fn.apply(th, args);
}
};
}
/*
* 使用方法
*/
// import { _debounce } from "@u/debounce";
// add:_debounce(function() {}) 不丢this
2529

被折叠的 条评论
为什么被折叠?



