【JavaScript】防抖(debounce)和节流(throttle)


 在 JavaScript 中,lodash 库提供了许多实用的函数来简化编码工作。其中,lodash 中的防抖(debounce)和节流(throttle)是两个常用的函数,用来限制函数的执行频率。合理的使用可以帮助我们在高频触发事件的情况下,控制回调函数的执行频率,提高程序性能。

防抖(debounce)

 防抖函数通过设置一个等待时间,在该时间内多次调用函数时,只会执行最后一次调用,并在等待时间结束后执行。这对于处理频繁触发的事件(如窗口调整、搜索输入)非常有用,可以避免函数过于频繁地执行。
用法示例:

// 引入lodash库
import { debounce } from "lodash";

// 定义一个简单的函数
function onResize() {
  console.log('窗口调整中...');
}

// 使用防抖函数包装函数,并设置等待时间为500毫秒
const debounceResize = debounce(onResize, 500);

// 监听窗口调整事件,并在事件触发时执行防抖函数
window.addEventListener('resize', debounceResize);

debounceResize函数通过debounce函数包装了onResize函数,并设置了等待时间为500毫秒。当窗口调整事件触发时,会执行debounceResize函数,但只有当停止操作500毫秒后才会执行onResize函数。

节流(throttle)

 节流函数通过设置一个间隔时间,在该时间内多次调用函数时,只会执行第一次调用,并在间隔时间结束后可以再次执行。这对于控制函数在一段时间内的执行次数非常有用,可以避免函数过于频繁地执行。
用法示例:

// 引入lodash库
import { throttle } from "lodash";

// 定义一个简单的函数
function onResize() {
  console.log('窗口调整中...');
}

// 使用节流函数包装函数,并设置间隔时间为1000毫秒
const throttleResize = throttle(onResize, 1000);

// 监听窗口调整事件,并在事件触发时执行节流函数
window.addEventListener('resize', throttleResize);

throttleResize函数通过throttle函数包装了onResize函数,并设置了间隔时间为1000毫秒。当窗口调整事件触发时,会执行throttleResize函数,但在1000毫秒内再次触发的事件不会执行onResize函数,直到间隔时间结束后可以再次执行。

参数使用(leading、trailing)

 使用lodash的防抖函数和节流函数时,还可以传递额外的参数来自定义它们的行为。传递leadingtrailing参数可以控制防抖和节流函数的首次执行行为。

  • leading 参数用于控制在防抖函数的等待时间内的首次调用是否立即执行,默认为 false。如果将其设置为 true,则首次调用会立即执行。
  • trailing 参数用于控制在防抖函数的等待时间结束后的最后一次调用是否执行,默认为 true。如果将其设置为 false,则最后一次调用不会执行。

用法示例:

import { debounce, throttle } from "lodash";

function onScroll() {
  console.log('滚动事件发生');
}

const debounceScroll = debounce(onScroll, 500, {
  leading: true,
  trailing: false,
});

const throttleScroll = throttle(onScroll, 1000, {
  leading: true,
  trailing: false,
});

window.addEventListener('scroll', debounceScroll);
window.addEventListener('scroll', throttleScroll);

 以上使用中,debounceScroll 函数和 throttleScroll 函数设置了 leading: truetrailing: false。这意味着滚动事件首次触发时会立即执行对应的函数,但在等待时间内后续的事件将不会再触发函数的执行。

链接Lodash 中文文档

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值