防抖和节流是 JavaScript 中用于优化性能的两种常用的技术。它们都是为了减少事件触发频率,从而提高页面性能和用户体验。
正常情况实现:触发onmousemove事件,显示当前鼠标的坐标,实现如下图:
防抖函数(debounce)
防抖函数是指在某个时间段内只执行一次代码。具体来说,当一个事件被触发后,它会在延迟一段时间后才执行代码。如果在延迟时间内又触发了这个事件,那么延迟时间会被重新计算,直到延迟时间结束后再执行代码。
javascript
function debounce(func, delay) {
let timerId;
return function() {
const context = this;
const args = arguments;
clearTimeout(timerId);
timerId = setTimeout(function() {
func.apply(context, args);
}, delay);
};
}
以上是一个通用的防抖函数,它接收两个参数:要执行的函数和延迟时间。当函数被调用时,它会清除之前的计时器并重新设置一个新的计时器,等待延迟时间后执行函数。
节流函数(throttle)
节流函数是指在某个时间段内只执行一次代码,与防抖不同的是,它不是等待延迟时间后执行代码,而是固定时间执行一次代码。
javascript
function throttle(func, limit) {
let inThrottle;
return function() {
const context = this;
const args = arguments;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(function() {
inThrottle = false;
}, limit);
}
};
}
以上是一个通用的节流函数,它接收两个参数:要执行的函数和固定时间。当函数被调用时,如果没有在固定时间内调用过该函数,则执行该函数,并设置一个计时器,在计时器结束后将 inThrottle 设为 false,这样在下一次调用时又可以执行该函数。
以上函数的实现,同样使用了闭包
想了解闭包的,可以看这篇文章