【进阶篇】js的防抖节流函数

简介: 【进阶篇】js的防抖节流函数

防抖和节流函数

阅读目录

    • 一 .防抖函数
    • 二 .节流函数
    • 三 .个人理解两者的区别

    一、防抖函数

    1.1 概念:

      触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

    1.2 使用场景:

      就像是我的搜索栏功能,是在里面内容变化后就实时触发搜索事件,但是有时候我们输

      的内容很长,在没有输完的时候就触发了事件,这样对性能来说是不好的,造成了很多

      无用的请求,这时候就需要用到防抖函数,来让其在搜索内容变化后的200毫秒内如果

      没有再更改才发起请求。

    1.3 实现防抖函数的思路:

      在高频触发事件的时候,取消原来的延时事件。

    1.4 具体实现:

    function debounce( fn ){ // 传一个回调函数
        let Mytime = null ;
        return function( ){ 
            clearTimeout( Mytime ) ; // 清除定时器
            Mytime  = setTimeout( () => {
                 fn.apply(this,arguments)
             }, 200)
        }
    }

    image.gif

    1.5 具体使用

    function sayHi() {
          console.log('防抖成功');
        }
    var select = document.getElementById('myselect');
    select .addEventListener('change', debounce(sayHi)); // 防抖

    image.gif

    二、节流函数

    2.1 概念:

      高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率;

    2.2 使用场景:

      就像我接了一个任务,只能在5秒完成任务给回复,在执行后的这5秒内,你再怎么给

      我布置任务我都不管直接当没听到,直到到5秒后执行完这个任务,你才可以再次给

      我布置任务,以此类推。。。

    2.3 实现思路:

      每次触发事件时都判断当前是否有等待执行的延时函数,如果有直接截断事件不用往下执行了;

    2.4 具体实现:

    function throttle( fn ){
        let canUse = true ; // 设置一个开关
        return function(){
            if(!canUse ){ return false } // 如果开关已经关掉了就不用往下了
            canUse  = false  // 利用闭包刚进来的时候关闭开关
            setTimeout( ( ) => { 
                    fn.apply(this,arguments)
              canUse = true // 执行完才打开开关
                },500)
        }
    }

    image.gif

    2.5 具体使用:

    function sayHi(e) {
          console.log(e.target.innerWidth, e.target.innerHeight);
        }
        window.addEventListener('resize', throttle(sayHi));

    image.gif

    三、个人理解两者的区别

    防抖函数和节流函数的一个区别就是防抖是按照最后一次触发为下一次事件执行的时间计算点,

    前面的没满足间隔时间的都从最后这一次开始来决定什么时候执行延时事件;

    而节流函数是按照第一次触发事件作为时间计算点,后面没到间隔时间的事件都忽略;

    目录
    相关文章
    |
    5月前
    |
    机器学习/深度学习 JavaScript 前端开发
    JS进阶教程:递归函数原理与篇例解析
    通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
    224 19
    |
    7月前
    |
    JavaScript
    JS实现多条件搜索函数
    JS封装的多条件搜索
    |
    9月前
    |
    JavaScript 前端开发
    JavaWeb JavaScript ③ JS的流程控制和函数
    通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
    189 32
    |
    8月前
    |
    JavaScript 前端开发 Java
    详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
    柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
    |
    前端开发 JavaScript 开发者
    除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
    【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
    |
    JavaScript 前端开发
    JavaScript 函数语法
    JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
    |
    存储 JavaScript 前端开发
    JS函数提升 变量提升
    【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
    |
    JavaScript Java 测试技术
    基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
    基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
    279 2
    |
    12月前
    |
    JavaScript 前端开发
    JavaScript中的原型 保姆级文章一文搞懂
    本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
    201 1
    JavaScript中的原型 保姆级文章一文搞懂
    |
    12月前
    JS+CSS3文章内容背景黑白切换源码
    JS+CSS3文章内容背景黑白切换源码是一款基于JS+CSS3制作的简单网页文章文字内容背景颜色黑白切换效果。
    124 0