// 防抖
// 也就是说当一个用户一直触发这个函数,且每次触发函数的间隔小于既定时间
// 那么防抖的情况下只会执行一次。
function debounce(fn, wait) {
var timeout = null;
return function() {
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(function() {
fn.apply()
}, wait);
}
}
// 处理函数
function handle() {
console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', debounce(handle, 1000));
// 节流
// 假设一个用户一直触发这个函数,且每次触发小于既定值,
// 函数节流会每隔这个时间调用一次
function throttle(fn,delay) {
// 方法1 定时器
var timeout = null;
return function() {
if (!timeout) {
timeout = setTimeout(function() {
fn();
timeout = null;
}, delay);
}
}
// 方法2 时间戳
var prev = Date.now();
return function() {
var now = Date.now();
if (now - prev >= delay) {
fn.apply();
prev = Date.now();
}
}
}
// 处理函数
function handle() {
console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', throttle(handle, 1000));
// 用一句话总结防抖和节流的区别:
// 防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行
// 使用场景:
// 节流:滚动加载更多、搜索框搜的索联想功能、高频点击、表单重复提交……
// 防抖:搜索框搜索输入,并在输入完以后自动搜索、手机号,邮箱验证输入检测、窗口大小 resize 变化后,再重新渲染。