JavaScript一句话讲清楚防抖与节流

防抖:n秒后再执行再在执行某项事件,若是n秒内重复触发,则重新计时(王者回城)

节流:n秒内只运行一次,若在n秒反复触发,只有一次生效(王者技能)

实现方式

防抖实现

function debounce(func,delay){
    let timeoutId
    
    return function(){
        const context = this //保存this指向
        const args = arguments //拿到event对象
        
        clearTimeout(timeoutId)
        timeoutId = setTimeout(() => {
            func.apply(context,args)
        },delay)
    }
}

防抖的引用场景常见的有

  • 搜索框输入,当用户输入搜索时,使用防抖函数来延迟发送请求,以减少不必要请求

代码模拟实现

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Search Box</title>
</head>
<body>
<input type="text" id="searchInput" placeholder="Type something...">
<div id="searchResults"></div>
​
<script>
function debounce(func, delay) {
    let timeoutId;
    
    return function() {
        const context = this;
        const args = arguments;
        
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => {
            func.apply(context, args);
        }, delay);
    };
}
​
// 模拟搜索函数
function search(query) {
    // 这里可以执行搜索操作,例如发送 AJAX 请求
    // 这里只是简单地显示搜索结果
    document.getElementById('searchResults').innerText = 'Searching for: ' + query;
}
​
const searchInput = document.getElementById('searchInput');
​
// 使用防抖函数来处理搜索框输入事件
searchInput.addEventListener('input', debounce(function(event) {
    const query = event.target.value;
    search(query);
}, 300)); // 设置防抖延迟时间为 300ms
</script>
</body>
</html>
​
  • 窗口大小调整,当窗口调整时,使用防抖函数来延迟调整布局,以提高性能

节流实现

function throttled2(fn, delay = 500) {
    let timer = null
    return function (...args) {
        if (!timer) {
            timer = setTimeout(() => {
                fn.apply(this, args)
                timer = null
            }, delay);
        }
    }
}

节流常见的应用场景有

  • 页面滚动,滚动页面时可能会触发一些操作,比如加载更多内容或者执行动画效果,使用节流能够确保这些操作在用户滚动频率过快时不会导致性能问题。

// 定义一个节流函数
function throttle(func, delay) {
  let lastCall = 0;
  return function(...args) {
    const now = new Date().getTime();
    if (now - lastCall >= delay) {
      func(...args);
      lastCall = now;
    }
  };
}
​
// 实际要执行的滚动处理函数
function handleScroll() {
  console.log("处理滚动事件");
  // 在这里编写你的滚动处理逻辑
}
​
// 使用节流函数包装滚动处理函数,限制执行频率为每500毫秒一次
const throttledScroll = throttle(handleScroll, 500);
​
// 添加滚动事件监听器
window.addEventListener("scroll", throttledScroll);
​

  • 鼠标移动:当用户移动鼠标时,可能触发一些操作,使用节流能够确保这个操作不会过于频繁的执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值