js 闭包实现计数器不用全局变量

理解闭包为何能够实现这样的功能,需要了解一些关于JavaScript作用域和内存管理的基本概念。

JavaScript中的作用域和生命周期

在JavaScript中,当函数执行时,会创建一个执行上下文,其中包含该函数的局部变量。通常情况下,当函数执行完毕后,这些局部变量会被垃圾回收机制(Garbage Collector)清理,因为它们不再被引用。

但是,闭包是一种特殊情况。

什么是闭包?

闭包是指那些能够访问其外部函数作用域的函数,即使在外部函数执行完毕之后。这意味着,闭包能够“记住”它在创建时所处的环境(作用域)。

变量为什么没有被删除?

在自调用函数的例子中,虽然自调用函数执行完毕,但返回的内部函数仍然持有对 counter 变量的引用。由于这个引用存在,counter 变量不会被垃圾回收机制清理,从而实现了“私有变量”的效果。

让我们再次看一下代码:

const add = (function() {
    let counter = 0;  // 计数器变量,处于自调用函数的作用域内

    // 返回一个可以访问和修改 counter 的函数
    return function() {
        counter += 1;
        return counter;
    };
})();

详细解释:

  1. 自调用函数:定义并立即执行,创建了一个新的作用域,其中包含变量 counter

  2. 返回的函数:被赋值给 add,这个返回的函数能够访问 counter,因为它被定义在自调用函数的内部。

  3. 闭包的创建:当自调用函数执行完毕,返回的函数仍然“记住”了它的创建环境,包括 counter 变量。这就是闭包的形成。

形象的理解

可以把闭包想象成一个外卖订单(闭包),在订单中你指定了一些信息(变量 counter)。虽然餐厅(自调用函数)已经关门了,但外卖员(返回的函数)还记得你下单时指定的信息,并可以继续处理你的订单。

闭包的工作原理

  1. 函数执行上下文:当自调用函数执行时,它创建了一个新的执行上下文,包含变量 counter

  2. 变量作用域链:返回的内部函数拥有一个作用域链(scope chain),该链包含其自身的作用域以及外部函数的作用域。在这个例子中,返回的函数可以通过作用域链访问 counter

  3. 引用保持:由于返回的函数持有对 counter 的引用,这个引用使得 counter 变量在自调用函数执行完毕后依然存在。

小结

闭包之所以能够让变量在外部函数执行完毕后依然存在,是因为返回的内部函数保持了对这些变量的引用。正是这种引用,确保了变量不会被垃圾回收机制清理,从而实现了“私有”变量的效果。这种特性在许多场景中非常有用,例如数据隐藏、回调函数、事件处理器等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解读:Etched Sohu与Groq LPU芯片的区别

本文简单讲解一下Etched Sohu与Groq LPU两种芯片的区别。 设计理念的差异 首先,这两款产品在设计理念上完全是两条不同的路线。Etched Sohu芯片的设计理念是围绕Transformer模型进行优化。Transformer模型近年来在NLP任务中表现出色,Etched公司因此为其…

SpringSecurity中文文档(Servlet Password Storage)

存储机制(Storage Mechanisms) 每种支持的读取用户名和密码的机制都可以使用任何支持的存储机制: Simple Storage with In-Memory AuthenticationRelational Databases with JDBC AuthenticationCustom data stores with UserDetailsServic…

4个免费文章生成器,为你免费一键生成原创文章

在当今的创作领域,创作者们常常陷入各种困境。灵感的缺失、内容创新的压力,每一项都如同沉重的枷锁,束缚着他们的创作步伐。但随着免费文章生成器的出现,宛如一场及时雨,为创作者们带来了新的希望和转机。免费文章生成…

【ABB】原点设定

【ABB】原点设定 操作流程演示 操作流程 操作轴回原点编辑电机校准偏移更新转速计数器 1.首先得了解机器手的轴,这里以6轴作参考。 注意先回456轴,后回123轴。 2.然后需要了解机器人关节运动模式,即选择如下两个模式。 3.注意机器人各轴移动…

19C 单机文件系统安装文档

准备工作 1)查看系统版本、内核参数 more /etc/redhat-release more /etc/redflag-releaseuname -a2)查看当前系统是否配置了HugePages。在下面的查询中,HugePages的几个相关值都为0,表明当前未配值HugePages,其次可以看到该版本的大页大小为…

Linux服务器性能参数指标

【摘要】一个基于 Linux 操作系统的服务器运行的同时,会表征出各种各样参数信息,这些蛛丝马迹往往会帮助快速定位跟踪问题。 这里只是一些简单的工具查看系统的相关参数,当然很多工具也是通过分析加工 /proc、/sys 下的数据来工作的&#xff…

课设:选课管理系统(Java+MySQL)

在本博客中,我将介绍用Java、MySQL、JDBC和Swing GUI开发一个简单的选课管理系统。 技术栈 Java:用于编写应用程序逻辑MySQL:用于存储和管理数据JDBC:用于连接Java应用程序和MySQL数据库Swing GUI:用于构建桌面应用程…

RH850系列芯片深度剖析 1.8-内存管理之MPU

RH850系列芯片深度剖析 1.8-内存管理之MPU 文章目录 RH850系列芯片深度剖析 1.8-内存管理之MPU一、MPU简介1.1 功能特性1.2 系统保护标识符(SPID)二、保护区域设置2.1 保护区域属性设置2.2 保护区域设置注意事项2.2.1 跨越保护区域边界2.2.2 无效的保护区域设置2.2.3 保护违规…

【anaconda】—“conda info“命令后conda配置和环境信息的理解

文章目录 conda配置和环境信息的理解 conda配置和环境信息的理解 安装anaconda成功后,打开cmd,输入"conda info"命令,结果显示如下: conda的配置和环境信息的输出。以下是对每个字段的解释: active environm…

记录一下被一行代码耽误的一下午

记录一下被一行代码耽误的一下午 代码如下: defineOptions({name: OrderRewards})起因使用了yudao的项目框架,前端页面切换之后莫名其妙重新刷新页面,而另外的页面则会保存检索条件 页面配置页面 设定路由的名字,一定要填写不然…

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十二)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 32 节) P32《31.通知-基础通知》 基础文本类型通知:briefText 没有用,写了也白写。 长文本类型…

[SAP ABAP] 版本管理

版本管理是指软件开发过程中各种程序代码、配置文件以及说明文档等文件变更的管理 生成版本 版本管理 对比版本 点击上述版本管理即可进行版本对比操作 补充扩展 我们可以使用事务码SE10对传输请求进行创建、修改、删除、合并以及更改所有者等操作 使用事务码SCC1进行不同cl…

CV01_相机成像原理与坐标系之间的转换

目录 0.引言:小孔成像->映射表达式 1. 相机自身的运动如何表征?->外参矩阵E 1.1 旋转 1.2 平移 2. 如何投影到“像平面”?->内参矩阵K 2.1 图像平面坐标转换为像素坐标系 3. 三维到二维的维度是如何丢失的?…

【CentOS7.6】docker部署EMQX教程,本地镜像直接导入(附下载链接),没法在云服务器上魔法拉取镜像的快来

总览 先把下载链接放在这里吧,这是 EMQX 的 tar 包,能够直接导入 CentOS 的 docker: 链接:https://pan.baidu.com/s/1rSGSLoVvj83ai6d5oolg8Q?pwd0108 提取码:0108 一、安装配置教程 1.将 EMQX-latest.tar 包导入…

记录第一次写脚本

使用csh语言,Linux系统操作的 写和执行csh(C Shell)脚本不需要额外的软件,只需要一个支持csh的终端环境。 1.检查是否安装了C Shell 在终端terminal运行以下命令 which csh 如果返回路径,比如/bin/csh&#xff0c…

【mybatis】mybatisX插件概述

一、主要功能 智能补全与提示 MyBatisX 可以智能地提示和补全 SQL 语句中的关键字、表名、列名等信息,从而显著提高开发效率。代码生成器 虽然 MyBatisX 本身可能不直接提供一个完整的、独立的代码生成器,但它可能集成了或支持与其他代码生成工具&#…

【Linux进阶】磁盘分区2——MBR和GPT

1.磁盘的分区 因为如果你的磁盘被划分成两个分区,那么每个分区的设备文件名是什么? 在了解这个问题之前,我们先来复习一下磁盘的组成,因为现今磁盘的划分与它物理的组成很有关系。 我们谈过磁盘主要由碟片、机械手臂、磁头与主轴马…

Tomcat(+Servlet)笔记+代码

Tomcat安装和配置 安装在不含中文的路径,路径不能太长 Apache 官网👇 Apache Tomcat - Welcome! 配置部分 点击下图红框处,找到Tomcat安装位置 添加项目的文件 配好的话,红框这里有个猫 代码部分 新建jsp文件,里…

小程序渗透测试的两种方法——burpsuite、yakit

首先呢主要是配置proxifier,找到小程序的流量,然后使用burpsuite或者yakit去抓包。 一、使用burpsuiteproxifier的抓包测试 1、先配置proxifier,开启http流量转发 勾选确定 2、配置burp对应代理端口,选择profile,点…

基于React和TypeScript的开源白板项目(Github项目分享)

在学习前端开发的过程中,有时候我们需要一些有趣的项目来提升我们的技能。今天我要给大家介绍的是一个非常酷的项目——NinjaSketch,这是一个用React和TypeScript构建的简易白板工具。这个项目使用了Rough.js来实现手绘风格的效果。尽管这个应用不是响应…
最新文章