认识 JS 中的函数防抖

5 篇文章 0 订阅
4 篇文章 0 订阅

认识 JS 中的函数防抖

什么是函数防抖?

举个简单的例子,我们为页面注册 mousemove 事件时,我们可以预知的是 mousemove 事件的触发频率十分之高,如果我们在 mousemove 事件中进行了比较费时的操作(比如修改dom的布局),则页面可能会发生卡顿的现象,这种现象我称它为抖动。

函数防抖的原理

JS 中有提供的有两个定时器的功能,一个是 setInterval,另一个是 setTimeout,函数防抖就是利用了 setTimeout 延迟执行的原理进行实现,函数防抖函数我们只需实现一遍,后续即可重复使用

函数防抖的代码实现
/**
 * 函数防抖
 * @param {function} fn: 要执行的函数
 * @param {number} delay: 要延迟的时间,单位为毫秒
 */
function debounce(fn, delay) {
  // 1. 返回一个函数
  // 2. 因为使用 setTimeout 来实现防抖,
  // 要声明一个 timerId 来接收 setTimeout 的返回值
  var timerId; // 每次函数执行,都会产生一个新的函数作用域,所以每次调用 debounce 方法 timerId 都是不同的
  // 将进行处理防抖的函数返回出去
  return function () {
    // 3. 处理要传入的参数的问题,因为参数的数量、类型都是不确定的
    // 所以不能参数不能按固定的书写方式一个个传入,已知函数中存在一个
    // arguments 类数组,里面存放着所有的参数信息
    // 又知 使用apply方法会改变this指向,而参数的传入方式是一个数组
    // 4. 将类数组转换成真正的数组
    var args = Array.prototype.slice.call(arguments);
    // 5. 被调用后先清除上一次的定时器,这样上一次的定时器被清除,
    // 从而避免事件触发的太频繁而频繁执行我们绑定的不希望频繁被执行的函数
    clearTimeout(timerId);
    // 6. 重新为timerId 赋值
    timerId = setTimeout(function () {
        // 7. 使用apply方法将参数已数组的形式传递进去
        fn.apply(this, args);
    }, delay)
  }
}
应用场景

鼠标移动、窗体大小发生改变事件等触发频率过高的事件,当我们不希望它触发的那么频繁的时候,我们使用函数防抖来处理

举个例子,当窗体大小发生改变的时候我们需要在控制台打印一句话。

  ```javascript
  window.onresize = debounce(function () {
      console.log('窗体的大小被改变了');
  }, 666)
  ```

  > 上面的 onresize 事件绑定的方法,只用当窗体大小停止改变 666 毫秒之后才会在控制台进行打印
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: JavaScript 函数防抖(debounce)是一种技术,可以防止函数在短间内多次触发。 当函数被触发防抖函数会延迟执行函数,并且如果在延迟期间内再次触发函数,则会重新计算延迟间。这样可以避免函数在短间内多次触发,从而节省资源。 举个例子,假设你有一个函数,用于搜索用户输入的内容。如果每次用户输入都立即触发函数,会导致函数频繁触发,浪费资源。使用防抖函数,可以在用户输入后延迟一段间才触发函数,从而节省资源。 下面是一个简单的防抖函数的例子: ``` function debounce(fn, delay) { let timer = null; return function () { const context = this; const args = arguments; clearTimeout(timer); timer = setTimeout(function () { fn.apply(context, args); }, delay); } } ``` 上面的防抖函数接受两个参数:`fn` 是要进行防抖函数,`delay` 是延迟间(单位为毫秒)。防抖函数返回一个新函数,在新函数设置了延迟执行的逻辑。 使用防抖函数的方法如下: ``` const debouncedFunction = debounce(function () { // 在这里 ### 回答2: JavaScript 函数防抖是一种常用的优化技术,旨在减少函数的调用频率。 当一个函数被频繁触发防抖机制会在一定的延迟间内,只执行最后一次触发的函数调用。这样可以避免函数被频繁执行,提高性能和用户体验。 实现函数防抖有两种方式:立即执行和延迟执行。 立即执行的函数防抖,意味着只有当函数被最后一次调用,才会立即执行函数。延迟执行的函数防抖,意味着只有当函数在一定间内没有被再次调用,才会执行函数。 通过使用定器和闭包,可以实现函数防抖的功能。当函数被触发,先清除之前设置的定器,然后重新设置一个延迟执行的定器。如果在延迟间内再次触发函数,就会清除之前设置的定器,重新设置一个新的延迟执行的定器。只有当延迟间内没有再次触发函数,定器才会执行函数函数防抖在多种场景都有应用。比如在用户输入搜索框,可以使用函数防抖来减少发送搜索请求的频率;在窗口大小改变,可以使用函数防抖来优化页面重绘的性能。 总之,JavaScript 函数防抖是一种常用的优化技术,通过减少函数的调用频率来提高性能和用户体验。在实现上,可以通过定器和闭包来实现函数防抖的功能。 ### 回答3: JavaScript函数防抖是一种提高性能和优化用户体验的技术。它所解决的问题是在一段间内频繁触发某个函数,只执行最后一次触发的函数调用。 实现函数防抖的方法是利用定器。当触发事件,会开始一个定器,如果在指定的间间隔内再次触发了该事件,定器就会被清除并重新开始计。这样,只有在最后一次触发事件后的等待间内没有再次触发,才会执行相应的函数调用。 函数防抖在实际应用有很多场景。比如,在用户输入搜索框,可以利用函数防抖来减少发送请求的次数,只在用户停止输入一段间后才发起实际的搜索请求。又如,在窗口大小调整,可以利用函数防抖来优化响应式布局,只在窗口停止调整一段间后才重新计算样式。 以下是一个简单的实现函数防抖的示例代码: ```javascript function debounce(func, delay) { let timerId; return function() { const context = this; const args = arguments; clearTimeout(timerId); timerId = setTimeout(function() { func.apply(context, args); }, delay); }; } // 创建一个防抖函数 const debouncedFunc = debounce(function() { console.log('Function debounced'); }, 300); // 触发函数 debouncedFunc(); // 不会执行 debouncedFunc(); // 不会执行 debouncedFunc(); // 不会执行 // 等待300毫秒后,只执行一次 ``` 以上示例代码,`debounce`函数接受一个函数和一个延迟间参数,返回一个新函数,实现了函数防抖的逻辑。在创建防抖函数后,多次调用这个函数,只有停止调用一段间后才会执行实际的函数逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值