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

news/2024/7/8 2:30:55 标签: javascript, 开发语言, ecmascript

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

JavaScript中的作用域和生命周期

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

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

什么是闭包?

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

变量为什么没有被删除?

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

让我们再次看一下代码:

javascript">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.niftyadmin.cn/n/5536121.html

相关文章

mac鼠标键盘共享:ShareMouse for Mac 激活版

hareMouse 是一款 Windows 和 macOS 操作系统上的共享和切换鼠标和键盘的实用工具。这款软件允许用户在多台计算机之间无缝地共享鼠标和键盘,使得在不同设备之间进行工作和操作变得更加便捷。占用资源少: ShareMouse 设计轻量,占用系统资源较…

华硕电脑格式化后电脑会怎样?数据怎么恢复

在数字化时代,电脑已经成为我们日常生活和工作中不可或缺的设备。然而,在使用电脑的过程中,有时我们会遇到需要格式化硬盘的情况。对于华硕电脑用户而言,了解格式化后的影响以及如何恢复磁盘数据至关重要。本文将详细探讨华硕电脑…

Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL

章节内容 上一节我们完成了: Reduce JOIN 的介绍Reduce JOIN 的具体实现DriverMapperReducer运行测试 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次&am…

58、Flink 的项目配置使用 Maven 详解

2)使用 Maven 1.版本要求 Maven 3.8.6 (推荐或者使用更高版本)Java 8 (deprecated) or Java 11 2.将项目导入 IDE 创建项目目录和文件后,建议将此项目导入到 IDE 进行开发和测试。 IntelliJ IDEA 支持开箱即用的 Maven 项目。 注意: Ja…

数据库之SQL(一)

目录 一、简述数据库分页 二、简述SQL中的聚合函数 三、简述表与表是如何关联的 四、简述外连接 五、简述数据库的左连接和右连接 一、简述数据库分页 1、MySQL分页语法: 在MySQL中,SELECT语句默认返回所有匹配的行,它们可能是指定表中的…

ARM架构服务器/虚拟机编译部署Tendis(国产化替换Redis)

文章目录 一、概述 二、安装相关组件 三、下载最新的Tendis源码 四、编译源码 五、启动Tendis 六、使用Docker镜像部署Tendis 七、常见报错 八、参考链接 一、概述 国产化项目要求尽可能使用国产组件,尤其是已存在的项目,需要替换已有组件,比如使用Tendis替换Redis。…

【LeetCode】十三、分治法:多数元素 + 最大子序列和

文章目录 1、分治法2、leetcode169:多数元素3、leetcode53:最大子序和 1、分治法 分治一般都搭配递归使用: 用分治法的一个应用——归并排序:将一组数不停的一分为二,直到分到每组只有一个数的时候 分到每组只有一个数…

LLama-Factory大模型训练框架,基于自己数据集微调qwen7B模型实战

一,项目简介 LLama-Factory,大模型训练框架,支持多种模型,多种训练方式, 项目github地址:link 项目特色 多种模型:LLaMA、LLaVA、Mistral、Mixtral-MoE、Qwen、Yi、Gemma、Baichuan、ChatGL…