节流和防抖是JavaScript中常用的性能优化手段。它们主要用于优化频繁触发的事件,比如resize、scroll、mousemove等。
节流和防抖的目的都是为了减少函数的执行次数,提升性能。
节流是指在一定时间间隔内只执行一次函数。例如,当用户连续滚动页面时,我们可以使用节流来减少触发事件的次数,从而提高性能。
节流的实现方式有两种:
使用时间戳实现节流,即在一定时间内执行第一次触发事件的操作,之后在时间间隔内忽略所有操作,直到下个时间间隔开始时再执行第一次触发事件的操作。
function throttle(func, wait) { let lastTime = 0; return function() { let nowTime = new Date().getTime(); if (nowTime - lastTime > wait) { func.apply(this, arguments); lastTime = nowTime; } } } // 示例 window.addEventListener('scroll', throttle(function() { console.log('scroll'); }, 1000));
使用定时器实现节流,即在一定时间内执行最后一次触发事件的操作,之前的所有操作都被忽略。
function throttle(func, wait) { let timeout; return function() { if (!timeout) { timeout = setTimeout(() => { func.apply(this, arguments); timeout = null; }, wait); } } } // 示例 window.addEventListener('scroll', throttle(function() { console.log('scroll'); }, 1000));
防抖是指在一定时间内只执行最后一次触发事件的操作。例如,当用户连续输入时,我们可以使用防抖来减少触发事件的次数,从而提高性能。
防抖的实现方式有一个:
使用定时器实现防抖,即在一定时间间隔内,每次触发事件都重新计时,直到时间间隔到达后执行最后一次触发事件的操作。
function debounce(func, wait) { let timeout; return function() { clearTimeout(timeout); timeout = setTimeout(() => { func.apply(this, arguments); }, wait); } } // 示例 window.addEventListener('resize', debounce(function() { console.log('resize'); }, 1000));
使用节流和防抖可以有效地减少函数的执行次数,提升页面的性能。