JavaScript防抖和节流的使用及区别

简介: JavaScript防抖和节流的使用及区别

什么场景下使用防抖和节流
在进行窗口的resize、scroll、输出框内容校验等操纵的时候,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常之差。那么为了前端性能的优化也为了用户更好的体验,就可以采用防抖(debounce)和节流(throttle)的方式来到达这种效果,减少调用的频率。

为什么滚动scroll、窗口resize等事件需要优化
滚动事件的应用很频繁:图片懒加载、下滑自动加载数据、侧边浮动导航栏等。

在绑定scroll、resize事件时,但它发生的时候,它被触发的频率非常高,间隔很近。在日常开发的页面中,事件中涉及到的大量的位置计算、DOM操作、元素重绘等等这些都无法在下一个scroll事件出发前完成的情况下,浏览器会卡帧。

滚动和页面渲染前端性能优化的关系
为什么滚动需要优化?前面提到了事件中涉及到大量的位置计算、DOM操作、元素重绘等等,这些又与页面的渲染有关系,页面渲染又与前端的性能优化有关系?套娃一样,一层套着一层,每一层都联系紧密,每一层都如此平凡且重要。

回顾一下前端的渲染和优化
web页面展示经历的步骤:js—style—layout—paint—composite。

网页生成的时候,至少会渲染(Layout+Paint)一次。用户访问的过程中,还会不断重新的重排(reflow)和重绘(repaint),用户scroll行为和resize行为会导致页面不断的进行重新渲染,而且间隔频繁,容易造成浏览器卡帧。

防抖Debounce
防抖Debounce情景

有些场景事件触发的频率过高(mousemove onkeydown onkeyup onscroll)

回调函数执行的频率过高也会有卡顿现象。 可以一段时间过后进行触发去除无用操作

防抖原理
一定在事件触发 n 秒后才执行,如果在一个事件触发的 n 秒内又触发了这个事件,以新的事件的时间为准,n 秒后才执行,等触发事件 n 秒内不再触发事件才执行。

官方解释: 当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时。

案例:

<template>
  <div id="app">
    <!-- 实现防抖 -->
    <input type="text" v-model="searchStr">
  </div>
</template>

<script>
export default {
   
  name: 'App',
  data(){
   
    return {
   
      searchStr:"",
      fun:null
    }
  },
  watch:{
   
    searchStr: function (str) {
   
      if (typeof str ==='string'){
   
        if (str.trim().length!==0){
   
            this.debounce(this.changeStr,1000);
        }else {
   }
      }
    }
  },
  mounted(){
   

  },
  methods:{
   
    // 实现防抖
    debounce(fn,wait){
   
      if (this.fun!==null){
   
          clearTimeout(this.fun)
      }
      this.fun = setTimeout(fn,wait)
      // setTimeout(() => {
   

      // },1000)
    },
    changeStr(){
   
        console.log('已触发防抖机制')
    },
  }
}
</script>

<style scoped>

</style>

节流Throttle
节流Throttle情景

图片懒加载
ajax数据请求加载

节流原理

如果持续触发事件,每隔一段时间只执行一次函数。

官方解释: 当持续触发事件时,保证一定时间段内只调用一次事件处理函数。

案例:

<template>
  <div id="app">
    <!-- 实现节流 -->
    <button @click="throttle(2000)">节流</button>
  </div>
</template>

<script>
export default {
   
  name: 'App',
  data(){
   
    return {
   
      timeout:null
    }
  },
  mounted(){
   

  },
  methods:{
   
    // 实现节流
    throttle (wait) {
   
      if (!this.timeout) {
   
          this.timeout = setTimeout(() => {
   
            this.timeout = null
            console.log('已触发节流机制')
          }, wait)
      }
    }
  }
}
</script>

<style scoped>

</style>

节流防抖总结
防抖:原理是维护一个定时器,将很多个相同的操作合并成一个。规定在延迟触发函数,如果在此之前触发函数,则取消之前的计时重新计时,只有最后一次操作能被触发。

节流:原理是判断是否达到一定的时间来触发事件。某个时间段内只能触发一次函数。

区别:防抖只会在最后一次事件后执行触发函数,节流不管事件多么的频繁,都会保证在规定时间段内触发事件函数。

目录
相关文章
|
3月前
|
JavaScript 前端开发 索引
js的循环中foreach、for in和for of的区别
js的循环中foreach、for in和for of的区别
144 0
|
11天前
|
设计模式 JavaScript 前端开发
js中new和object.creat区别
【10月更文挑战第29天】`new` 关键字和 `Object.create()` 方法在创建对象的方式、原型链继承、属性初始化以及适用场景等方面都存在差异。在实际开发中,需要根据具体的需求和设计模式来选择合适的方法来创建对象。
|
29天前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
36 1
|
29天前
|
存储 JavaScript 前端开发
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
JavaScript 数据类型分为基本数据类型和引用数据类型。基本数据类型(如 string、number 等)具有不可变性,按值访问,存储在栈内存中。引用数据类型(如 Object、Array 等)存储在堆内存中,按引用访问,值是可变的。本文深入探讨了这两种数据类型的特性、存储方式、以及检测数据类型的两种常用方法——typeof 和 instanceof,帮助开发者更好地理解 JavaScript 内存模型和类型检测机制。
67 0
JavaScript 数据类型详解:基本类型与引用类型的区别及其检测方法
|
1月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
16 2
|
1月前
|
JavaScript 前端开发
【JavaScript】let,const和var的区别
总的来说,随着ECMAScript 6(ES6)及后续版本的推广,`let`和 `const`因其增强的块级作用域和对变量行为的更严格控制,逐渐成为现代JavaScript编码实践中推荐使用的变量声明方式。而 `var`由于其历史遗留的局限性,正逐渐被边缘化,但在维护老代码或处理特定兼容性需求时仍需了解。
32 3
|
2月前
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
2月前
|
JavaScript 前端开发
JavaScript中单引号和双引号的效果的一点区别
JavaScript中单引号和双引号的效果的一点区别
|
2月前
|
JavaScript 前端开发
js防抖函数返回值问题解决方案
本文介绍了如何在JavaScript中创建一个带有返回值的防抖函数,通过结合Promise来实现。这种防抖函数可以在事件触发一定时间后再执行函数,并能处理异步操作的返回值。文章提供了防抖函数的实现代码和如何在实际项目中使用该防抖函数的示例。
30 1
|
2月前
|
前端开发 JavaScript API
JavaScript 的宏任务和微任务有什么区别
【9月更文挑战第6天】JavaScript 的宏任务和微任务有什么区别
58 4