JavaScript中防抖和节流的实现

本文介绍了JavaScript中防抖(debounce)和节流(throttle)的概念及其应用场景。防抖技术常用于用户输入验证,如输入框延迟3秒触发查询;节流则适用于限制频繁触发的事件,如每隔30分钟响应一次客户提问。两者通过闭包实现,避免外部变量污染。示例代码展示了如何实现防抖和节流函数。
摘要由CSDN通过智能技术生成

JavaScript中防抖和节流的实现

这篇文章写起来主要是因为上一篇文章说起了闭包的由来,但是篇幅有限没介绍其应用。

先说一下防抖和节流的概念,然后分别举一个例子

防抖

在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

场景示例

要求用户在输入框内输入文本后3s后触发查询,如果输入后3s内又输入了新的内容,则继续等待三秒。

代码示例

function debounce(fn,delay) {
  let timeout = null;
  return function () {
   if(timeout){
     clearTimeout(timeout);
   }
   timeout = setTimeout(() => {
    fn.apply(this, arguments);
   },delay);
  }
}
const quert = function(input){
  ***
  return XXX
}
const handleInput = debounce(query,3000)

然后我们把handleInput绑定到change事件上就行了~~

节流

规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。稀释事件执行频率。

场景示例

电话客服比较忙,对于客户的提问,他们每30分钟只顾得上回应一次,其余时间内不做处理(当然这都是假设哈哈,这要是这样那哪里行)

代码示例

function throttle(fn,delay) {
  let flag = false;
  return function () {
   if (flag) {
     return;
   }
   flag = true;
   setTimeout(() => {
     flag = false;
     fn.apply(this, arguments);
   }, delay);
  }
}
const server = function(query){
  ***
  return XXX
}
const handleServer = throttle(server,30*60*1000)

还有一种方式是时间戳,大家这个就自行查阅了哈

防抖和节流说白了都是使用一个标识来记录函数是应该直接忽略还是可以直接触发。而这个标识,正是通过闭包来实现的。如果没有闭包的话,就需要一个外部变量来记录。这样做也不是不可以,主要是担心外部变量被污染到。(当然,闭包的由来可不是为了变量不被污染,具体自行查阅上一篇文章)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
防抖节流是优化 JavaScript 代码性能的两个重要技术,它们可以控制函数的执行频率,从而提高代码的响应速度和性能。下面是用 JavaScript 实现防抖节流的示例代码: ## 防抖 防抖可以控制一个函数在一段时间内只执行一次,常用于输入框搜索、滚动加载等场景。以下是一个基本的防抖函数实现: ```javascript function debounce(func, delay) { let timerId; return function(...args) { if (timerId) { clearTimeout(timerId); } timerId = setTimeout(() => { func.apply(this, args); timerId = null; }, delay); }; } ``` 这个函数接收两个参数,第一个参数是要进行防抖处理的函数,第二个参数是等待时间。该函数返回一个新的函数,每次调用这个新的函数时,会启动一个计时器,等待指定的时间后才会执行传入的函数。 例如,假设我们有一个搜索函数 search(),需要防抖处理,等待 500 毫秒后执行。可以这样调用: ```javascript const debouncedSearch = debounce(search, 500); input.addEventListener('input', event => { debouncedSearch(event.target.value); }); ``` 上面的代码将输入框的输入事件绑定到 debouncedSearch 函数上,每次输入事件发生时,debouncedSearch 函数会启动一个计时器,等待 500 毫秒后才会调用 search 函数。如果在 500 毫秒内再次输入事件发生,计时器会被重置,等待时间重新开始计算。 ## 节流 节流可以控制一个函数在一段时间内最多执行一次,常用于滚动事件、resize 事件等场景。以下是一个基本的节流函数实现: ```javascript function throttle(func, delay) { let timerId; return function(...args) { if (timerId) { return; } timerId = setTimeout(() => { func.apply(this, args); timerId = null; }, delay); }; } ``` 这个函数接收两个参数,第一个参数是要进行节流处理的函数,第二个参数是等待时间。该函数返回一个新的函数,每次调用这个新的函数时,会启动一个计时器,如果计时器已经启动,就直接返回,否则会等待指定的时间后才会执行传入的函数。 例如,假设我们有一个图片懒加载函数 lazyLoad(),需要节流处理,等待 200 毫秒后执行。可以这样调用: ```javascript const throttledLazyLoad = throttle(lazyLoad, 200); window.addEventListener('scroll', throttledLazyLoad); ``` 上面的代码将滚动事件绑定到 throttledLazyLoad 函数上,每次滚动事件发生时,throttledLazyLoad 函数会启动一个计时器,等待 200 毫秒后才会调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值