JavaScript基础——闭包

news2024/12/28 19:00:30

闭包简介

闭包的作用

        闭包可以保留变量的状态

        闭包可以让变量私有化

闭包的缺点


闭包简介

        在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。

        在JavaScript中,闭包是指封闭的执行环境,指的是一个函数能够记住并访问其创建时所在的作用域,即使这个函数在其原始作用域之外被执行,也就是说一个函数(内部)有权访问另一个(外部)函数作用域的变量。闭包通常由嵌套函数创建,即一个函数内部定义了另一个函数。外层函数可以返回内层函数,而内层函数可以访问外层函数的变量。

        语法如下:

        function 函数名称() {
            代码块
            return function () {
                代码块
            }
        }

        定义函数f1,定义f1函数局部作用域的变量user,再定义一个匿名函数作为f1函数的返回值,匿名函数可以访问user,也就是内部函数可以访问外部函数作用域的变量。

        // 局部变量
        function f1() {
            var user = '小明';
            function foo() {
                console.log("hello" + user);
            }
            // 函数也是数据,把这个函数作为f1的返回值,调用f1可以获取foo
            return foo;
        }

        // 由f1所形成的封闭环境,叫做闭包
        var bibao1 = f1();
        bibao1();

        将f1改为直接使用返回函数return function()的形式。

        function f2() {
            var user = '小明';
            return function () {
                console.log("hello2" + user);
            }
        }
        var bibao2 = f2();
        bibao2();

        定义一个add()函数,定义局部变量num,在函数中写一个内部函数作为返回值,如果不写这个内部函数的话,每次看到的数值只有0(初始值)。

        add()函数返回了一个闭包,这个闭包能够访问并修改add函数作用域内的变量num。每次调用这个闭包时,它都会增加num的值并打印出来。

        function add() {
            var num = 0;
            return function () {
                num++;
                console.log('数字:', num);
            }
        }

        创建两个闭包的实例bibao3和bibbao4,每次调用add函数,每个闭包都会创建一个新的num变量(相当于开辟新的内存空间),bibao3和bibao4直接是相互独立的。

        既然调用函数是函数名称()的形式,为什么不能直接用函数名称()()访问闭包呢?

闭包的作用

        闭包可以保留变量的状态

        创建闭包时,会创建一个新的内存空间,都会开辟独立的内存空间,在闭包中的变量可以记住当前的状态,再次使用闭包时,闭包会保留之前的状态。

        在前面的案例中,每次bibao3()或者bibao4(),都会按照上一次的值进行自增。

        闭包可以让变量私有化

        每次创建一个新的闭包,就会开辟独立的内存空间,闭包的变量都是私有的。

        在前面的案例中,每次bibao3()或者bibao4(),bibao3()和bibao4()的num值是不相同的。

闭包的缺点

        闭包虽然在JavaScript中提供了强大的封装和数据保护能力,但也存在一些缺点。首先,由于闭包能够捕获并长期持有其创建时的作用域中的变量,这可能导致内存使用增加,尤其是在大量创建闭包的情况下,可能会引起内存泄漏。其次,闭包可能会形成难以追踪的循环引用,这会阻碍JavaScript垃圾回收机制的效率,从而影响程序的性能。此外,闭包的使用如果不当,会增加代码的复杂性,使得理解和维护变得更加困难。因此,开发者在使用闭包时需要谨慎,确保在不需要时及时释放引用,避免不必要的内存占用,并合理组织代码以提高可读性和可维护性。

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

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

相关文章

“论软件开发过程RUP及其应用”写作框架,软考高级,系统架构设计师

论文真题 RUP(Rational Unified Process)是IBM公司的一款软件开发过程产品,它提出了一整套以UML为基础的开发准则,用以指导软件开发人员以UML为基础进行软件开发。RUP汲取了各种面向对象分析与设计方法的精华,提供了一…

Wireshark显示过滤器常用关键字及过滤表达式

Wireshark显示过滤器常用关键字及过滤表达式 1. 过滤器类型 Wireshark抓包工具提供了两种类型过滤器:抓包过滤器 和 显示过滤器。 抓包过滤器: 抓取满足过滤条件的数据包,不满足过滤条件的数据包不会被抓取。 显示过滤器: 包已…

C语言基础⑩——构造类型(结构体)

一、数据类型分类 1、基本类型 整数型 短整型:short(2个字节);整型(默认):int(4个字节);长整型:long(8个字节)&#xf…

延迟队列插件

3.10 1.在opt文件夹里建一个rabbitmq文件夹,把插件放进去 2.拷贝到容器内plugins目录下(rabbitmq是容器的name,也可以使用容器id) docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins 进入 Docker 容器…

Java面试八股之什么是JMS

什么是JMS JMS(Java Message Service)是Java平台中关于面向消息中间件(MOM)的API,用于在分布式环境中发送和接收消息。JMS API提供了一种标准的、与供应商无关的方式,使得Java应用程序能够创建、发送、接收…

分布式数据库在传统车联网厂商的应用实践 | OceanBase案例

本文作者:慧视通科技,梁君 传统车联网厂商运维百亿级数据的痛点与难点 深圳慧视通科技(简称慧视通)作为专业的位置数据综合运营服务提供商,一直深耕智能交通领域,依托车联网、云计算、大数据处理、无线通信…

【STM32+HAL】杆球控制系统

一、前言 2017年电赛出了道板球控制系统题目,现写一个简化版本——杆球控制系统,以此记录电赛集训生活。 二、题目分析 最终采取的方案是:OpenMV读取小球的当前位置,并将坐标值传给STM32端,再由32通过电机改变杆的位置…

Proxmox 8.1.3 系统安装堡塔云 waf 防火墙

堡塔云 waf 工作原理: 堡塔云 waf 是一款Web应用防火墙,区别于传统防火墙,WAF 工作在应用层,对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果,使其免于受到黑客的攻击。 堡塔云 waf 采用半容器化部署&#xff0…

消息中间件相关笔记整理

目录 1. 简述消息队列 2. 常见的的消息队列中间件 2.1 Kafka概念及结构 基本概念名词解释 为什么要设置多个副本? 2.2 Kafka的工作流程 消息生产流程 消息存储流程 消息消费流程 2.3 面试必问题 如何保证消息不丢失? 消费者如何保证消息不重…

JVM垃圾回收算法有哪些

JVM垃圾回收算法有哪些 标记清除算法(mark and sweep) 将垃圾回收分为两个阶段:标记和清除 根据可达性分析算法得出的垃圾进行标记 对标记的内容进行垃圾回收 优点: 标记和清除速度较快 缺点: 碎片化较为严重,内存不连贯 标记整理算法 记录存活的对象,清除需要回收的对…

oracle创建账户

1、查看表空间 SELECT tablespace_name FROM user_tablespaces;2、创建用户 CREATE USER FLINKCDC2 IDENTIFIED BY "123456";也可以使用指定表空间的方式 CREATE USER FLINKCDC2 IDENTIFIED BY "123456" DEFAULT TABLESPACE LOGMINER_TBS QUOTA UNLIMIT…

企业为什么要管理好员工的工作微信?

为什么要管理员工工作微信,可以从以下几个方面进行优化和丰富: 一、优化人力资源配置: 提高工作效率:通过监控和管理员工的工作微信,企业可以确保每位员工的时间被合理分配,专注于与工作相关的沟通和任务…

【区块链+食品安全】基于 FISCO BCOS 联盟链的供应链溯源管理系统 | FISCO BCOS应用案例

冷冻食品企业通常会面临以下痛点: 1. 食品安全问题:无法迅速确定受污染或有质量问题的产品来源,导致召回时效延迟,增加企业的风险和损失。 2. 信息不透明:传统的供应链系统存在记账信息孤岛,数据无法溯源…

opencascade Bnd_Range源码学习区间表示

opencascade Bnd_Range 前言 这个类描述了由两个实数值限定的 1D 空间中的区间。 一个区间可以是无效的,这表示区间中不包含任何点。 方法 1 //! 默认构造函数。创建一个无效区间。 Bnd_Range() : myFirst(0.0), myLast(-1.0) {} 2 //! 构造函数。不会创建无效…

Java后端面试题(redis相关1)(day7)

目录 为什么要用Redis?Redis到底是多线程还是单线程?Redis数据持久化机制RDB方式AOF方式 Redis是单线程,但为什么快?Redis 过期删除策略Redis 内存淘汰策略 为什么要用Redis? 基于内存操作,内存读写速度快k…

XSS漏洞分析

原理:利用网页开发时web应用程序对用户输入过滤不足导致将恶意代码注入到网页中,使用户浏览器加载并执行恶意代码,通常是JavaScript类型,也包括java、vbs、flash、html等。 解码的顺序是HTML,URL和JavaScript。 常用…

【运维】macos使用微软官方远程桌面工具mstsc控制windows10教程(含失败的解决方法)

【环境】macos使用微软官方远程桌面工具mstsc控制windows10教程(含失败的解决方法) 文章目录 1、如何获取本地账号密码并连接2、失败:检查被控权限是否有打开3、失败:登录过微软账号的情况 1、如何获取本地账号密码并连接 打开cm…

mysql 物理备份 MySQL 全量备份 增量备份 差异备份 日志备份万字长文 1.3万字

版权声明:本文为博主原创文章,遵循版权协议,转载请附上原文出处链接和本声明 注意,通常 完备增备,日志(binlog)备,结合使用 差异则根据具体情况选用。 此备份过程 属于公司 常用的单个数据…

OpenVLA: An Open-Source Vision-Language-Action Model

发表时间:13 Jun 2024 作者单位:Stanford University Motivation: the potential to change how we teach robots new skills。然而,VLA 对机器人技术的广泛采用具有挑战性,因为 1)现有的 VLA 在很大程度上是封闭的并…

Linux: 进程概念详解

目录 1. 冯诺依曼体系结构 2. 操作系统(Operator System) 1. 概念 2. 设计OS的目的 3. 任务 (定位) 4. 理解管理 3. 进程 1. 基本概念 2. 描述进程-PCB 3. 进程状态 4. 创建进程 fork 5. (Zombie)-僵尸进程 6. 孤儿进程 7. 进程优先…