JS 函数节流和函数防抖的区别(JS 与 Vue 用法)

一、区别

  • 防抖与节流的相同点: 为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟,假死或卡顿的现象。

  • 函数防抖(debounce): 短时间内连续触发事件后 n 秒内函数只会执行一次,如果 n 秒内事件再次被触发,则重新计算时间,所以短时间内的连续动作永远只会触发一次。

  • 函数节流(throttle): 短时间内连续触发事件,但在 n 秒内只会执行一次,也就是说即预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期,所以节流会稀释函数的执行频率。

二、JS 版本

<body>
  <!-- 输入框 -->
  <input type="text" id="my-input">
  <!-- JS -->
  <script>
    // 防抖
    function debounce (fn, delay) {
      var delay = delay || 200
      var timer = null
      return function () {
        var that = this
        var args = arguments
        if (timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(function () {
          timer = null
          fn.apply(that, args)
        }, delay)
      }
    }
    
    // 节流
    function throttle (fn, interval) {
      var last = null
      var timer = null
      var interval = interval || 200
      return function () {
        var that = this
        var args = arguments
        var now = +new Date()
        if (last && now - last < interval) {
          clearTimeout(timer)
          timer = setTimeout(function () {
            last = now
            fn.apply(that, args)
          }, interval)
        } else {
          last = now
          fn.apply(that, args)
        }
      }
    }

    // 输入监听
    const input = document.getElementById('my-input')
    input.oninput = throttle(function (e) {
      console.log(e.target.value)
    }, 500)
  </script>
</body>

三、Vue 版本

<template>
  <!-- input -->
  <input type="text" @input="onInput">
</template>

<script>
// vue 自带插件,如果没有自带自行安装($ npm i -save lodash)
import _ from 'lodash'
export default {
  methods: {
    // 防抖
    onInput: _.debounce(function (e) {
      console.log(e.target.value)
    }, 500),
    // 节流
    onInput: _.throttle(function (e) {
      console.log(e.target.value)
    }, 500)
  }
}
</script>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡尔特斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值