关于防抖和节流

类型

大白话区别

用哪个函数?

像啥样?

防抖

必须等你 “停下”,才干一次

tt 函数

电梯等最后一个人,再关门

节流

不等你停,到固定时间就干一次

throttled1 函数

公交车每 10 分钟一班,到点就走

防抖代码

// 防抖函数:tt是函数名,fn是要干的活,delay是等多久(毫秒)
function tt(fn, delay) {
  let time = null; // 相当于“电梯的倒计时器”
  return function(...args) {
    if (time) { // 只要有人新进来(再次触发)
      clearTimeout(time); // 就把之前的倒计时清掉
    }
    // 重新定一个新倒计时:等delay毫秒后再干活
    time = setTimeout(() => {
      fn.apply(this, args); // 执行要干的活(比如发搜索请求)
      time = null; // 干完活把倒计时器清空
    }, delay);
  };
}

// 怎么用?拿“搜索”举例
// 1. 先写“要干的活”:比如发搜索请求
function search(keyword) {
  console.log("发请求搜:", keyword); // 实际项目里这里会写真正的搜索逻辑
}

// 2. 用防抖函数tt包装search,设定“停输500毫秒再搜”
const debouncedSearch = tt(search, 500);

// 3. 给输入框加事件:打字时触发包装后的函数
const inputBox = document.querySelector("input"); // 找页面里的输入框
inputBox.addEventListener("input", function(e) {
  debouncedSearch(e.target.value); // 把输入的内容传给搜索函数
});

节流代码

// 节流函数:throttled1是函数名,fn是要干的活,delay默认500毫秒(可改)
function throttled1(fn, delay = 500) {
  let oldtime = Date.now(); // 记录“上一次干活的时间”(初始是当前时间)
  return function(...args) {
    let newtime = Date.now(); // 每次触发时,拿“现在的时间”
    // 如果“现在 - 上次干活时间”≥delay,就执行一次
    if (newtime - oldtime >= delay) {
      fn.apply(null, args); // 执行要干的活(比如查加载)
      oldtime = Date.now(); // 干完活,把“上次时间”更改为现在
    }
  };
}

// 怎么用?拿“滚动加载”举例
// 1. 先写“要干的活”:比如查要不要加载新内容
function checkLoadMore() {
  console.log("看看要不要加载新朋友圈~"); // 实际项目里这里写判断逻辑
}

// 2. 用节流函数throttled1包装,设定“每300毫秒查一次”
const throttledLoad = throttled1(checkLoadMore, 300);

// 3. 给页面加滚动事件:滚动时触发包装后的函数
window.addEventListener("scroll", throttledLoad);


关于防抖和节流
http://localhost:8090/archives/guan-yu-fang-dou-he-jie-liu
作者
Administrator
发布于
2025年10月15日
许可协议