1、闭包、防抖、节流

简介: 1、闭包、防抖、节流

1、什么是闭包


简单来说就是,函数嵌套函数,内部的函数就是闭包。当我们想访问内部函数的时候,我们是不能够直接访问的,所以需要在外面函数设置一个返回值,把内部函数作为返回值返回出来。这样外部环境就可以使用内部函数,也就是闭包。正常一个函数被执行完毕时,里面的变量就会被销毁。但闭包不是,虽然外部函数已经执行完毕,但内部函数赋值给了外部的变量,内部函数还没有被执行完,它还存储在内存空间中,所以外部函数的内容空间没有被销毁,外部函数的变量保存了下来。


    function outerFun() {
      let num = 10;
      function innerFun() {
        console.log(num);
      }
      return innerFun;
    }
    // 全局环境下拿到内部函数,相等于fun:innerFun
    let fun = outerFun();
    // 直接调用内部函数
    fun();


2、什么是防抖?


  • 用户触发事件过于频繁,我们只需要最后一次事件的操作即可


  //  1、防抖:用户触发事件过于频繁,只需要最后一次事件的操作
  let dataInput = document.querySelector('input');
  dataInput.oninput = antiShake(function () {
    console.log(this.value);
  }, 2000);
  //  2、封装防抖
  function antiShake(fn, wait) {
    let timeOut = null;
    return function () {
      if (timeOut) clearTimeout(timeOut);
      //  用call把this指针指向input
      timeOut = setTimeout(() => { fn.call(this); }, wait);
    }
  }

3、什么是节流?


  • 用户触发事件过于频繁,控制每隔多少秒发生一次;例如,表单提交
//  3、节流:用户触发事件过于频繁,控制每隔多少秒发生一次;例如,表单提交
  let submit = document.querySelector('button');
  let click = true;
  submit.onclick = throttle(function () {
    console.log('hello world');
    click = true;
  }, 2000);
  //  4、封装节流
  function throttle(fn, wait) {
    return function () {
      if (click) {
        setTimeout(() => {
          fn();
        }, wait)
      }
      click = false;
    }
  }


相关文章
|
2月前
|
人工智能 API 开发工具
Skills比MCP更重要?更省钱的多!Python大佬这观点老金测了一周终于懂了
加我进AI学习群,公众号右下角“联系方式”。文末有老金开源知识库·全免费。本文详解Claude Skills为何比MCP更轻量高效:极简配置、按需加载、省90% token,适合多数场景。MCP仍适用于复杂集成,但日常任务首选Skills。推荐先用SKILL.md解决,再考虑协议。附实测对比与配置建议,助你提升效率,节省精力。关注老金,一起玩转AI工具。
|
9月前
|
监控 前端开发 Java
Spring拦截链的实现原理是什么?
拦截器是Spring MVC中处理请求的重要机制,通过拦截链可在请求的不同阶段插入自定义逻辑。本文详解拦截链的实现原理、核心组件如HandlerMapping、HandlerAdapter、DispatcherServlet和HandlerInterceptor的作用,以及拦截器在请求处理中的工作流程。了解这些内容有助于开发者更好地掌握Spring MVC的请求处理机制,并灵活应用于权限验证、日志记录等场景。
133 1
|
10月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
483 3
Android利用selector(选择器)实现图片动态点击效果
|
关系型数据库 MySQL 数据库连接
DBeaver如何连接一个数据库
【10月更文挑战第27天】DBeaver 是一款功能强大的通用数据库管理工具,支持多种主流数据库。本文介绍了使用 DBeaver 连接数据库的基本步骤,包括下载安装、创建新连接、选择数据库类型、配置连接参数、测试连接以及最终连接到数据库。详细的操作指南帮助用户轻松管理和操作数据库。
4927 9
|
存储 缓存 安全
动态DMA映射指南 【ChatGPT】
动态DMA映射指南 【ChatGPT】
|
机器学习/深度学习 人工智能 自然语言处理
深度学习与自然语言处理的融合:重塑语言理解的未来
【8月更文挑战第5天】在自然语言处理(NLP)领域,深度学习技术引发了一场革命,极大提升了语言理解与生成能力。本文探讨深度学习与NLP的融合现状、关键技术如RNN、LSTM、GRU及Transformer模型,预训练语言模型如BERT和GPT的作用,以及迁移学习的应用。这些技术已在机器翻译、文本分类、智能客服等多个场景取得显著成果,并展望未来模型效率、可解释性、跨模态融合及个性化服务等发展趋势。
|
Oracle 关系型数据库 数据库
实时计算 Flink版产品使用问题之连接到Oracle数据库但无法读取到数据,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

热门文章

最新文章