js_防抖与节流(闭包的使用)

简介: js_防抖与节流(闭包的使用)

防抖事件

定义:持续触发事件,一定时间内没有触发事件,事件处理函数只会执行一次,

当设定的时间内触发过一次事件后会重新开始延时。

例:输入框的事件(2s显示内容,不是实时刷新显示内容),对比输入框的内容事件。

实时刷新的效果

<div class="container">
      <div class="left">
        <p>实时刷新显示内容</p>
        <input type="text" id="leftInput" />
        <div class='textDiv' id="textShow"></div>
      </div>
      
      <div class="right"></div>
    </div>
    <script>
      var inputDom=document.getElementById('leftInput');
      inputDom.addEventListener('keyup',function(e){
        var textDom=document.getElementById('textShow');
        console.log(e.target.value);
        textDom.innerText=e.target.value;
      })  
    </script>

输入123456会依次打印123456的金字塔

防抖(1s内显示输入内容)

<div class="container">
      <div class="left">
        <p>防抖(1s内显示输入内容)</p>
        <input type="text" id="leftInput" />
        <div class='textDiv' id="textShow"></div>
      </div>
      
      <div class="right"></div>
    </div>
    <script>
      // 防抖
      var inputDom = document.getElementById('leftInput');
      // 函数柯里化
      function debounce(delay, callback) {
        let timer
        return function(value) {
          //闭包内存泄漏
          clearTimeout(timer)
          timer = setTimeout(function() {
            //执行
            callback(value)
          }, delay)
        }
      }
      // 显示内容的函数
      function showText(value) {
        var textDom = document.getElementById('textShow');
        console.log(value)
        textDom.innerText = value;
      }
      var debounceFunc = debounce(1000, showText);
      inputDom.addEventListener('keyup', function(e) {
        let value = e.target.value
        debounceFunc(value)
      })
    </script>

1s内输入123456只会打印一次123456

节流事件

定义:一段时间直只调用一次事件处理函数

实际用例:提交事件 、游戏的技能cd(在游戏cd中点击n次都不会发动技能)

// 节流
      var skillDom = document.getElementById('skillTriger');
      function throttle(wait,callback) {
        let timeOut;
        return function(value) {
          if (!timeOut) {
            timeOut = setTimeout(function() {
              callback(value);
              //执行一次,时间段内的都不知执行
              timeOut = null;
            }, wait)
          }
        }
      }
      function skillEvent(value){
        var textDom = document.getElementById('skillEventId');
        console.log(value)
        ++count
        textDom.innerText = value+count;
      }
      var skillAc=throttle(3000,skillEvent)
      var count=0
      skillDom.addEventListener('click', function(e) {
        let value = e.target.value
        skillAc(value)
      })

完整的html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>防抖与节流</title>
  </head>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    .container {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 600px;
      height: 400px;
      background: #262626;
      display: flex;
    }
    .left {
      position: relative;
      width: 50%;
      height: 100%;
      background: #00cec9;
      box-sizing: border-box;
      overflow: hidden;
    }
    .right {
      position: relative;
      width: 50%;
      height: 100%;
      background: #b2bec3;
    }
  </style>
  <body>
    <div class="container">
      <div class="left">
        <p>防抖(1s内显示输入内容)</p>
        <input type="text" id="leftInput" />
        <div class='textDiv' id="textShow"></div>
      </div>
      <div class="right">
        <p>节流(3s内触发一次)</p>
        <input type="submit" id="skillTriger" value="发动技能" />
        <div class='skillEvent' id="skillEventId"></div>
      </div>
    </div>
    <script>
      // 防抖
      var inputDom = document.getElementById('leftInput');
      // 函数柯里化
      function debounce(delay, callback) {
        let timer
        return function(value) {
          //闭包内存泄漏
          clearTimeout(timer)
          timer = setTimeout(function() {
            //执行
            callback(value)
          }, delay)
        }
      }
      // 显示内容的函数
      function showText(value) {
        var textDom = document.getElementById('textShow');
        console.log(value)
        textDom.innerText = value;
      }
      var debounceFunc = debounce(1000, showText);
      inputDom.addEventListener('keyup', function(e) {
        let value = e.target.value
        debounceFunc(value)
      })
      // 节流
      var skillDom = document.getElementById('skillTriger');
      function throttle(wait, callback) {
        let timeOut;
        return function(value) {
          if (!timeOut) {
            timeOut = setTimeout(function() {
              callback(value);
              //执行一次,时间段内的都不知执行
              timeOut = null;
            }, wait)
          }
        }
      }
      function skillEvent(value) {
        var textDom = document.getElementById('skillEventId');
        console.log(value)
          ++count
        textDom.innerText = value + count;
      }
      var skillAc = throttle(3000, skillEvent)
      var count = 0
      skillDom.addEventListener('click', function(e) {
        let value = e.target.value
        skillAc(value)
      })
    </script>
  </body>
</html>


目录
相关文章
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
11月前
|
前端开发 JavaScript Java
JavaScript闭包深入剖析:性能剖析与优化技巧
JavaScript 闭包是强大而灵活的特性,广泛应用于数据封装、函数柯里化和事件处理等场景。闭包通过保存外部作用域的变量,实现了私有变量和方法的创建,提升了代码的安全性和可维护性。然而,闭包也可能带来性能问题,如内存泄漏和执行效率下降。为优化闭包性能,建议采取以下策略:及时解除对不再使用的闭包变量的引用,减少闭包的创建次数,使用 WeakMap 管理弱引用,以及优化闭包结构以减少作用域链查找的开销。在实际开发中,无论是 Web 前端还是 Node.js 后端,这些优化措施都能显著提升程序的性能和稳定性。
257 70
|
9月前
|
存储 JavaScript 前端开发
|
11月前
|
自然语言处理 JavaScript 前端开发
当面试官再问我JS闭包时,我能答出来的都在这里了。
闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
458 16
当面试官再问我JS闭包时,我能答出来的都在这里了。
|
JavaScript 前端开发
js 闭包的优点和缺点
【10月更文挑战第27天】JavaScript闭包是一把双刃剑,在合理使用的情况下,它可以带来很多好处,如实现数据封装、记忆功能和模块化等;但如果不注意其缺点,如内存泄漏、变量共享和性能开销等问题,可能会导致代码出现难以调试的错误和性能问题。因此,在使用闭包时,需要谨慎权衡其优缺点,根据具体的应用场景合理地运用闭包。
350 58
|
10月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
缓存 JavaScript 前端开发
js 闭包
【10月更文挑战第27天】JavaScript闭包是一种强大的特性,它可以用于实现数据隐藏、记忆和缓存等功能,但在使用时也需要注意内存泄漏和变量共享等问题,以确保代码的质量和性能。
285 7
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
113 2
|
前端开发 JavaScript UED
JavaScript 中的函数防抖与节流详解及实用场景
在前端开发中,处理用户频繁触发的事件,如输入框的输入、按钮点击、窗口调整大小等,常常需要优化性能以减少无效操作。为此,函数防抖(debounce)和函数节流(throttle)是两种常见的性能优化手段。本文将详细介绍两者的区别与实现,并探讨它们的应用场景。
684 1
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。