关于Js debounce(防抖)函数和throttle(节流)小结

简介: 关于Js debounce(防抖)函数和throttle(节流)小结

闭包的实际运用防抖


防抖:当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,


如果设定的时间到来之前,又一次触发了事件,就重新开始 延时。


(如果在一段时间内,又触发了该事件;就重新开始 延时)


主要运用


1==>在用户输入,进行搜索时可以使用防抖


2==>射击游戏中的mousedown、keydown事件  


3==>搜索,结束后n秒后才进行搜索;n秒内,又输入就重新计时


3==>echarts的resize函数的底层就有防抖


节流:在规定时间内,保证执行一次该函数。


将函数调用赋值给变量;


此时函数已经执行了一次哈


你认为test函数有没有被执行
   <script>
        function test() {
            console.log('我是被执行了一次的');
        }
        let aa = test(); 
    </script>
已经执行了
//将函数调用赋值给变量;此时函数已经执行了一次哈


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" id="input">
    <script>
        function debounce(func, delay) {
            console.log(1)
            let timer;
            return function (args) {
                clearInterval(timer);
                timer = setTimeout(function () {
                    // 在delay秒内执行某一个func事件;
                    func(args)
                }, delay)
            }
        }
        function inputFunction(val) {
            console.log(`你输出的结束是${val}`);
        }
        //此时的防抖函数已经被执行过一次了;在赋值的过程中;
        const debouceInput = debounce(inputFunction, 500);
        const input = document.getElementById("input");
        input.addEventListener('keyup', function (e) {
            debouceInput(e.target.value)
        })
    </script>
</body>
</html>


我的第二个防抖函数


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="text" >
    <input type="submit" id="input"  value="按钮">
    <script>
        const btn = document.getElementById("input");
        btn.addEventListener('click', debounce(submit,2000),false)
        function submit(){
            console.log('点击了')
        }
        function debounce(func,timer) {
            var t=null;
            return function(){
                var fristTimer=!t;
                if(t){
                    clearTimeout(t)
                }
                if(fristTimer){
                    func.apply(this,arguments)
                }
                t=setTimeout(()=>{
                   t=null;
                },timer)
            }
        }
    </script>
</body>
</html>


这两个防抖函数的说明


第一个防抖函数的缺点是第一次进入该函数。


就会被执行


显然这样是不好的


所以我写了第二个防抖函数。就不会已进入就会被执行了


在vue3中防抖函数的使用


在src下创建utils.js文件


代码如下


export function debounce(func,timer) {
    var t=null;
    return function(){
        var fristTimer=!t;
        if(t){
            clearTimeout(t)
        }
        if(fristTimer){
            func.apply(this,arguments)
        }
        t=setTimeout(()=>{
            t=null;
        },timer)
    }
}


在某一个文件中使用


<template>
  <div>
     <button @click="handerClick">按钮</button>
  </div>
</template>
<script>
import { debounce } from "@/utils.js"
export default {
  setup () {
    const handerClick=debounce(()=>{
      // 你需要做的业务逻辑
      console.log('防抖在2s内触发');
    },2000)
    return { 
      handerClick
    }
  }
}
</script>


节流:


   当持续触发事件的时候,


   保证在一段时间内,只调用一次事件处理函数;


   点击王者荣耀回城的时候,就需要使用节流哈~


   典型就是:


   鼠标不断点击触发;规定在n秒内多次点击只有一次生效


节流函数在vue3中的使用


utils.js文件下的内容
// 节流函数的使用
export function throttle(func, delay) {
    var begin = 0;
    return function () {
        var cur = new Date().getTime();
        if (cur-begin>delay) {
            func.apply(this, arguments)
            begin=cur
        }
    }
}
vue3 需要的页面使用
<template>
  <div>
     <button @click="handerClick3">节流函数的使用</button>
  </div>
</template>
<script>
import { throttle } from "@/utils.js"
export default {
  setup () {
    const handerClick3=throttle(()=>{
      // 你需要做的业务逻辑
      console.log('防抖在2s内触发kkkkkkkkk');
    },3000)
    return { 
      handerClick3,
    }
  }
}
</script>
相关文章
|
23天前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
37 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
21天前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
2月前
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
2月前
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
2月前
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
42 1
|
2月前
|
JavaScript 前端开发
js教程——函数
js教程——函数
40 4
|
2月前
|
存储 JavaScript 前端开发
js中函数、方法、对象的区别
js中函数、方法、对象的区别
19 2
|
2月前
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
25 5
|
2月前
|
JavaScript 前端开发
Node.js 函数
10月更文挑战第5天
24 3
|
2月前
|
前端开发 JavaScript
探索JavaScript函数基础
探索JavaScript函数基础
19 3