关于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>
相关文章
|
3天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。
【6月更文挑战第25天】JavaScript闭包是函数访问外部作用域变量的能力体现,它用于封装私有变量、持久化状态、避免全局污染和处理异步操作。闭包基于作用域链和垃圾回收机制,允许函数记住其定义时的环境。例如,`createCounter`函数返回的内部函数能访问并更新`count`,每次调用`counter()`计数器递增,展示了闭包维持状态的特性。
17 5
|
1天前
|
JavaScript 前端开发
JavaScript作用域关乎变量和函数的可见范围。
【6月更文挑战第27天】JavaScript作用域关乎变量和函数的可见范围。全局作用域适用于整个脚本,局部作用域限于函数内部,而ES6引入的`let`和`const`实现了块级作用域。全局变量易引发冲突和内存占用,局部作用域在函数执行后消失,块级作用域提高了变量管理的灵活性。作用域关键在于组织代码和管理变量生命周期。
11 1
|
3天前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
10 2
|
3天前
|
JavaScript 前端开发
JavaScript函数核心概念:用于代码复用与管理。
【6月更文挑战第25天】JavaScript函数核心概念:用于代码复用与管理。示例包括定义(无参、有参、有返回值)与调用,参数按值传递。函数内修改参数不影响外部变量。
8 1
|
6天前
|
JavaScript 前端开发
JavaScript函数是代码复用的关键。使用`function`创建函数
【6月更文挑战第22天】JavaScript函数是代码复用的关键。使用`function`创建函数,如`function sayHello() {...}`或`function addNumbers(num1, num2) {...}`。调用函数如`sayHello()`执行其代码,传递参数按值进行。函数可通过`return`返回值,无返回值默认为`undefined`。理解函数对于模块化编程至关重要。
17 4
|
4天前
|
设计模式 JavaScript 前端开发
JS 代码变量和函数的正确写法大分享
在开发中,变量名,函数名一般要做到清晰明了,尽量做到看名字就能让人知道你的意图,所以变量和函数命名是挺重要
11 2
|
2天前
|
自然语言处理 前端开发 JavaScript
JavaScript 函数指南:掌握编程密钥库的精髓
JavaScript 函数指南:掌握编程密钥库的精髓
|
2天前
|
前端开发 JavaScript 安全
解锁 JavaScript ES6:函数与对象的高级扩展功能
解锁 JavaScript ES6:函数与对象的高级扩展功能
|
2天前
|
JavaScript
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
js -- 函数总结篇,函数提升、动态参数、剩余参数、箭头函数、this指向......
|
2天前
|
存储 JavaScript 前端开发
JavaScript——JavaScript基础:数组 | JavaScript函数:使用、作用域、函数表达式、预解析
在JavaScript中,内嵌函数可以访问定义在外层函数中的所有变量和函数,并包括其外层函数能访问的所有变量和函数。①全局变量:不在任何函数内声明的变量(显式定义)或在函数内省略var声明的变量(隐式定义)都称为全局变量,它在同一个页面文件中的所有脚本内都可以使用。函数表达式与函数声明的定义方式几乎相同,不同的是函数表达式的定义必须在调用前,而函数声明的方式则不限制声明与调用的顺序。③块级变量:ES 6提供的let关键字声明的变量称为块级变量,仅在“{}”中间有效,如if、for或while语句等。
17 0