JavaScript中的节流是一种优化高频率执行函数的技术。它允许我们控制函数被调用的频率,以避免过于频繁的函数调用导致页面性能问题。
节流的基本思想是在一段时间内只执行一次函数。例如,如果我们希望在用户拖动鼠标时触发某个事件,我们可以使用节流来减少事件处理函数的调用次数。具体的实现方法是,设置一个时间阈值(例如100毫秒),并在该时间段内忽略任何重复的函数调用。
以下是一个简单的实现节流的例子:
function throttle(func, delay) { let timerId; return function (...args) { clearTimeout(timerId); timerId = setTimeout(() => { func.apply(this, args); }, delay); } }
防抖是一种函数的执行策略,其基本思想是在执行函数前先等待一段时间,如果这段时间内没有再次触发该函数,则执行函数,否则重新等待。防抖的应用场景包括输入框输入时实时搜索,滚动条滚动时加载数据等。
实现一个简单的防抖函数,可以通过以下代码实现:
function debounce(func, delay) { let timerId; return function() { const context = this; const args = arguments; clearTimeout(timerId); timerId = setTimeout(function() { func.apply(context, args); }, delay); }; }
该函数接受两个参数,分别为需要防抖的函数和等待时间。在返回的函数中,通过 setTimeout 函数和 clearTimeout 函数来实现防抖的逻辑。每次调用返回函数时,都会清除之前的定时器,并重新设置定时器,如果等待时间内没有再次调用返回函数,则会执行原函数。
例如,如果需要实现一个实时搜索的功能,可以使用上述防抖函数来避免频繁地向服务器发送请求,代码示例:
const searchInput = document.querySelector('#search-input'); searchInput.addEventListener('input', debounce(function() { const searchValue = searchInput.value.trim(); if (searchValue) { // 发送请求 } }, 500));
注意,上述防抖函数的实现方式并不完美,可能会存在一些问题,例如 func
函数的上下文对象和参数的传递问题等,需要根据具体使用场景进行改进。