这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战javascript
不须要当即执行java
利用闭包,设置 timer 保存计时器状态ajax
每次触发事件时,不管如何先清空计时器,再开新计时器markdown
function debounce(fn, delay) {
let timer;
return function() {
const _args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this, _args);
}, delay);
};
}
复制代码
须要当即执行闭包
核心是有计时器就清除,并开启新计时器app
当即执行的逻辑是执行后开启一个定时器保持不可执行状态函数
/** * 防抖函数:每一次的高频触发只执行一次 * * @param fn 目标函数 * @param delay 延迟时间 * @param triggerNow 是否当即执行 * @return {(function(): void)|*} */
function debounce(fn, delay, triggerNow) {
let timer = 0;
let executed = false;
return function () {
const _args = arguments;
clearTimeout(timer);
// 先关闭定时器
if (triggerNow) {
// 若是须要当即执行
// 判断 executed 是否为 false,为 false 则执行
// 开启新定时器防止短期内再次触发
if (!executed) {
fn.apply(this, _args);
executed = true;
}
timer = setTimeout(function () {
executed = false;
}, delay);
} else {
// 若是不须要当即执行
// 每次触发开启新定时器便可
timer = setTimeout(function () {
fn.apply(this, _args);
}, delay);
}
};
}
复制代码
计算时间差实现post
function throttle(fn, interval) {
let begin = new Date().getTime()
return function() {
const _args = arguments
const cur = new Date().getTime()
// 过了指定长的时间才执行
if(cur - begin >= interval) {
fn.apply(this, _args)
begin = cur
}
}
}
复制代码
计时器实现ui
核心是有计时器就 returnthis
/** * 节流函数:高频触发时,按指定间隔执行 * * @param fn 目标函数 * @param interval 时间间隔 * @return {(function(): void)|*} */
function throttle(fn, interval) {
let timer = 0;
return function () {
const _args = arguments;
// 有定时器则返回
if (timer) {
return;
}
timer = setTimeout(() => {
fn.apply(this, _args);
timer = 0;
}, interval);
};
}
复制代码