闭包的理解

news2024/11/23 16:37:07

1.什么是闭包?

变量的私有化。一个函数内的变量,随着函数的执行完毕,对于的变量也会随着销毁,闭包可以让变量在函数执行完毕之后不必销毁,通常将这个变量通过匿名函数的形式return出去,这个变量只能被访问,不能被修改。

2.证明变量执行玩被销毁

(1)函数体没有被包裹之前的打印

    function fn() {
      var a = 10;
      return a++
    }
    console.log(fn());
    console.log(fn());
    console.log(fn());

打印的结果:

(2)函数体被包裹之后的打印

可以看出a变量每次都递增了1,从这个结论来看也可以说明a变量是没有被销毁的。

(3)解释不销毁的原因

return出去一个函数体,这个函数体需要一直访问fn函数,因此a变量不会被销毁,从而实现了递增的效果,因此闭包也被称为变量的私有化

3.闭包的案例

(1)防抖

持续触发不执行,一段时间不触发之后开始执行。

(2)节流的案例

<!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>
    <button id="aa">防抖</button>
  </body>
  <script>
    let btn = document.getElementById("aa");
    var timer;
    btn.addEventListener("click", function () {
      clearInterval(timer);
      timer = setInterval(() => {
        console.log(123);
      }, 2000);
    });
  </script>
</html>

这是一个简单的防抖案例。

(3)思路

我们在写代码之前的第一肯定是想到的是,添加点击事情,然后就是定时器任务,和清除定时器。

清除定时器的应该放在开始定时器的前面。这样在连续点击的时候每次点击就会清掉上一次的定时器

(4)定时器名字的选择

  代码:

   let btn = document.getElementById("aa");

    btn.addEventListener("click", function () {
      clearInterval(timer);
      let  timer = setInterval(() => {
        console.log(123);
      }, 2000);
    });

因为let 不会存在变量提升在函数里面定义了,我们要做的第一步就是清除定时器,没有定时器写清除定时器的代码当然会报错, 改成var会怎么样?var 在函数里面会存在变量提升的问题。

 var tiemr;
 clearInterval(timer);

这样代码还没开始,定时器就被清掉了,代码执行的结果:

(5)定时器名字的敲定

因此这个定时器的名字应该放在函数的外面

(6)代码的封装

const debounce = (fn, time) => {
            let timer = null
            return function (...args) {
                clearTimeout(timer)
                // this => oDiv
                timer = setTimeout(() => {
                    // 干啥!
                    fn.apply(this, args) // 调用的时候传递才是实参,window.fn()
                }, time)
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

((type *)0)->member的用法

问题缘由&#xff0c;在学习 rt-thread 内核的时候遇到了这么一行代码&#xff1a; to_thread rt_list_entry(rt_thread_priority_table[0].next,struct rt_thread, tlist); 而 rt_list_entry 的宏定义如下&#xff1a; /* 已知一个结构体里面的成员的地址&#xff0c;反推…

利用 Python 中的地理空间数据与 GeoPandas

推荐&#xff1a;使用 NSDT编辑器快速搭建3D应用场景 空间数据的真正潜力在于它能够连接数据点及其各自的位置&#xff0c;为高级分析创造无限的可能性。地理空间数据科学是数据科学中的一个新兴领域&#xff0c;旨在利用地理空间信息并通过空间算法和机器学习或深度学习等先进…

Android:使用命令行发现keytool不是内部命令解决办法

一、前言&#xff1a;最近在搞引入高德地图的SDK&#xff0c;发现需要给app签名打包。记录一下。 二、当我在命令行中输入keytool的时候说keytool不是内部命令 解决方案&#xff1a; 找到系统属性--------高级----------点击环境变量 双击点开 找到java\jre1.8.0_202\bin新建…

GLTF在线编辑器

GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预览 glTF/glb 文件。用户可以在不用安装任何插件的情况下直接在浏览中快速查看和编辑器3D模型。 它的功能特点如下&#xff1a; 1、打开GLTF模型 用户可以在GLTF编辑器中拖入GLB/GLTF模型或者选择打开本地GL…

Bootstarp4 设计网页轮播组件

很多网站都有广告轮播功能&#xff0c;可使用bootstrap4中的carousel组件非常简单的实现。 目录 下载bootstrap4 轮播功能实现 简单实现轮播组件 增加标识图标 增加标题和说明 切换淡入淡出 设置数据间隔 总结 下载bootstrap4 下载 Bootstrap Bootstrap v4 中文文档 …

Android13 下拉菜单栏中添加快捷截图按钮

Android 13 原生系统下拉状态栏中是没有快捷截图按钮,现在需要添加快捷截图功能。 添加快捷截图功能后的效果图: 涉及修改的文件如下: modified: vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml modified: vendor/mediatek/proprietary/…

软件测试的流程有哪些?

一、需求调研 1. 委托方提供资料 A. 填写测试委托申请表 B. 操作手册 C. 开发需求规格说明书 D. 开发合同及招标文件等 2. 双方技术沟通确定测试具体内容&#xff0c;如功能性测试、性能效率测试、信息安全性测试、兼容性测试、可靠性测试等。 3. 我方给出测试方案及报价…

SpringMVC学习|Servlet回顾、理解SpringMVC小demo、SpringMVC原理

Servlet回顾 创一个空的maven父工程&#xff0c;导入相关依赖&#xff0c;测试的、spring的、servlet的、jsp以及jstl标签的。 创建一个空的maven子项目&#xff0c;并添加web支持 为了保险起见&#xff0c;在子项目中添加servlet和jsp的依赖 编写一个Servlet类&#xff0c;实…

【Python】从入门到上头—常用内置模块基础应用(13)

文章目录 datetimebase64hashlibhmacurllibXMLHTMLParserrandom小结 datetime datetime是Python处理日期和时间的标准库。 获取当前日期时间 from datetime import datetime now datetime.now() # 获取当前datetime print(now) #2023-09-13 10:28:48.621343 print(type(no…

JSP ssm 网上求职管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSP ssm 网上求职管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采…

3900页手册415集视频426G资料迅为RK3568开发板

资料优势 专为3568编写|迅为原创|拒绝网络拼凑 20个手册2800页手册进行结构分层适用于学习与开发 为了方便大家清晰快速的学习&#xff0c;迅为iTOP-3568开发板手册资料全面升级&#xff0c;对手册内容进行了结构分层&#xff0c;共计20个文档&#xff0c;超2800页的资料专为…

sql注入之盲注总结

死在山野的风里&#xff0c;活在自由的梦里 sql注入之盲注总结 布尔 - 逻辑判断时间 - 延时判断报错 - 报错回显&#xff08;强制性报错 &#xff09;以DWVA靶场为例 盲注就是在注入的过程中&#xff0c;获取的数据不能显示到前端页面&#xff0c;此时&#xff0c;我们需要利用…

2023年武汉初级、中级、副高工程师职称评审条件是什么?甘建二告诉你

武汉中级职称评审通知已经出来了&#xff0c;武汉市中级、副高申报时间是8月31--9月18号&#xff0c;那么评这些职称需要满足什么条件呢&#xff1f;今天甘建二给大家分享一下评职称学历年限、专业等是怎么计算的&#xff0c;点赞收藏慢慢看。 一、武汉初级职称评审条件&#x…

【MySQL进阶】SQL性能分析

一、SQL性能分析 1.SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令&#xff0c;可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次&#xff1a; -- session 是查看当…

jvm深入研究文档--整体概念

阿丹&#xff1a; 精通JVM对于一个java工程师非常重要&#xff0c;要是深入了解了jvm就可以有效的面对下面的问题 程序调优&#xff1a;JVM的配置和调优对于程序的运行有着至关重要的影响。不同的业务场景需要不同的JVM配置&#xff0c;比如设置不同的垃圾收集器、调整新生代和…

软考 - 计算机组成与体系笔记

数据的表示 进制转化 二进制转十进制&#xff08;十进制以D表示&#xff09; 从右往左&#xff0c;用二进制位上的数字乘以2的n次幂的和&#xff08;n从0开始1累加&#xff09; 十进制转二进制&#xff08;二进制以B表示&#xff09; 十进制数不断除以2直至到0&#xff0c;得…

电子智能充气泵pcba/芯片方案

智能充气泵是一种常见的气体压缩设备&#xff0c;它可以将空气或其他气体压缩成高压气体&#xff0c;用于充气、输送、压缩等工业和生活领域。智能充气泵的原理是利用机械或电动力量将气体压缩&#xff0c;使其体积减小&#xff0c;压力增大&#xff0c;从而达到充气的目的。电…

【echarts】如何将iconfont转换成echart所需的path路径 echarts折线图、柱状图如何设置自定义svg图标

步骤 下载iconfont图标到本地&#xff0c;用浏览器打开&#xff0c;右键查看源代码&#xff0c;或者用开发IDE软件打开&#xff0c;找到path d...&#xff0c;这个就是我们要传递给echart的icon的值。 代码示例&#xff1a; legend: {data: data?.map((item) > item.comp…

Fiddler抓http数据

目录 参考博客 一、Fiddler配置二、分析Http请求1. Http消息结构简介1.1 Request请求消息1.2 Response响应消息 2. 分析Get接口2.1 请求示例2.2 查看Get请求2.3 查看Get响应 3 分析Post接口 参考博客 一、Fiddler配置 首先需要对Fiddler抓取Https请求进行相关配置&#xff1a…

【九章斩题录】C/C++:判定字符是否唯一

精品题解 &#x1f525; 《九章斩题录》 &#x1f448; 猛戳订阅 面试题 01.01. 判定字符是否唯一 ✅ 模板&#xff1a;C语言 class Solution { public:bool isUnique(string astr) {} }; &#x1f4ad; 思考&#xff1a;《程序员面试金典》里的题&#xff0c;这题和剑指Off…