震惊!原来这就是JavaScript闭包的秘密

📢 鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢 VUE专栏:想学VUE的,冲这里

📢 CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

 📢 JavaScript专栏:想学JavaScript的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!

目录

✨ 前言

什么是闭包

闭包的作用

实现闭包的条件

闭包的生命周期

✨ 结语


✨ 前言

        闭包(Closure)是JavaScript中一个非常重要却容易让人困惑的概念。明明是一个函数,为什么还能引用外部变量?今天我将为你揭开JavaScript闭包的神秘面纱,通过简单易懂的例子让你明白闭包的实际应用场景和作用。你将会对闭包有一个全新的认识,并能够在以后的代码中灵活运用它。跟着我一起抓住JavaScript闭包的真谛,成为JS高手吧!

什么是闭包

        闭包(Closure)是JavaScript一个很重要的概念,它使函数拥有保持其作用域链的能力。

        简单说,闭包让函数记住并继续访问定义函数的词法作用域,即使函数是在当前词法作用域之外被执行。

闭包的作用

闭包的主要作用有:

  1. 让函数访问外部变量
    function outer() {const x = 10;function inner() {return x; }return inner;
    }const getX = outer();
    getX(); // 返回10

  2. 封装变量,减少全局变量污染
    function counter() {let count = 0;return function() {return count++; }
    }const c1 = counter();
    c1(); // 0
    c1(); // 1

  3. 实现模块和信息隐藏
    function Person(name) {const age = 18;return {getName: function() {return name;},getAge: function() {return age;} };
    }const me = Person('Jack');
    me.getName(); // Jack
    me.getAge(); // 18

实现闭包的条件

  • 函数嵌套
  • 内部函数引用外部函数的变量
  • 外部函数返回内部函数

满足这三个条件就可以实现一个闭包。

闭包的原理可以简单概括为:

  1. 函数与其周围状态(lexical environment,又称词法环境)的组合。这个环境包含了函数定义时候的作用域中的任何局部变量。
  2. 当函数在其词法作用域以外被调用时,就会生成闭包。闭包会使原来的词法作用域链保持alive。所以闭包函数仍然可以访问定义时作用域中的变量。
  3. 闭包可以访问定义函数时的作用域。即使函数在定义作用域外被执行,那个作用域链并不会被销毁,仍然可被闭包访问。
  4. 闭包保留了原始作用域链,所以会比其他函数占用更多内存。

简单总结闭包的原理:

  • 函数执行时形成作用域
  • 函数和其周围状态的引用组合形成闭包
  • 这个组合使函数仍可访问定义时作用域的变量
  • 即使在定义作用域外执行

        所以说闭包是函数和其词法作用域的组合,可以通过闭包访问初始作用域的变量,起到封装变量的作用。

闭包的生命周期

闭包的作用域链不会被垃圾回收机制回收,因此会常驻内存。

过度使用闭包可能会导致内存占用过多。

正确使用闭包,在适当场景下可以提高代码优雅性,封装性,模块化。

        以上简要介绍了JavaScript闭包的概念、作用和实现。它是JavaScript一个非常重要的概念,合理利用闭包可以编写出更优雅高效的代码。

✨ 结语

        通过今天的学习,我们已经掌握了闭包的含义、实现条件、作用场景等,并通过示例代码加深了理解。闭包是JavaScript一个强大的特性,合理使用闭包可以帮我们封装变量,减少污染,实现信息隐藏。在模块化编程中,它也有非常重要的作用。但是滥用闭包也会导致内存问题。正确看待和运用闭包,我们的JavaScript代码会更优雅、高效。最后,如果你喜欢本文,欢迎分享给你的编程伙伴一起进步!

        我们改日再会

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

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

相关文章

硬盘基本知识(磁头、磁道、扇区、柱面)

概述 盘片(platter) 磁头(head) 磁道(track) 扇区(sector) 柱面(cylinder) 盘片 片面 和 磁头 硬盘中一般会有多个盘片组成,每个盘片包含两个面…

Eviews 11安装包下载及安装教程

Eviews 11下载链接:https://docs.qq.com/doc/DUmRGdXVUeVBSU1lK 1.选中下载好的安装包,右键解压到“Eviews 11”文件夹 2.选中"Setup.exe"鼠标右键选择以管理员身份运行 3.点击“Next” 4.勾选“I Accept...”,点击“Next” 5.选择…

理解String 及 String.intern() 在实际中的应用

1. 首先String不属于8种基本数据类型,String是一个对象。     因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。   2. new String()和new String(“”)都是申明一个…

记一次 .NET某工控 宇宙射线 导致程序崩溃分析

一:背景 1. 讲故事 为什么要提 宇宙射线, 太阳耀斑 导致的程序崩溃呢?主要是昨天在知乎上看了这篇文章:莫非我遇到了传说中的bug? ,由于 rip 中的0x41变成了0x61出现了bit位翻转导致程序崩溃,截图如下&am…

Jenkins接口调用

Jenkins是好用,但是接口文档写的稀烂 1、授权,Jenkins不推荐使用创建单个任务时创建的token,推荐这个用户下的创建user token。 点击自己账号信息,即可创建token。 2、postman选择basic auth,输入账号密码&#xff0…

CentOS 7 基于官方源码和openssl制作openssh 9.6 rpm包(含ssh-copy-id) —— 筑梦之路

之前写了一篇: CentOS 7 制作openssh 9.6 rpm包更新修复安全漏洞 —— 筑梦之路_升级openssh9.6-CSDN博客 有好几个网友反馈,ssh-keygen生成密钥存在问题,之前的rsa \ dsa加密算法用不了,因此写了一篇: 关于openssh…

nginx 二、配置域名

文章目录 一、配置本地域名查看虚拟机ip修改hosts文件测试域名是否配置成功 二、配置aliyun域名三、实践1.创建html2.配置nginx3.测试服务器内部测试页面测试 总结 docker中启动nginx容器完成如下操作,对于docker安装nginx可以看这篇文章 nginx 一、安装与conf浅析 …

Linux上搭建YApi

YApi是http接口管理和测试的重要工具,其作用相当于原来用的postman,但是比postman有更多的功能,本篇文章主要介绍如何在linux环境中快速的安装(利用yum命令安装)和部署YApi 一、nodejs 安装 1.1 下载nodejs包 yum i…

Harbor配置同步规则删除不掉

【问题原因】 harbor上主从两个仓库,配置同步规则时,定时任务配置太频繁,导致规则修改,删除都失败。 【问题现象】 点击修改后保存,页面报internal server error的错。 【问题排查】 docker ps | grep harbor 查看…

仓库管理软件有哪些比较好用?

“仓库管理软件有哪些比较好用?” “好用,却不一定适合。” 有时候,不是某个仓库管理软件不好用,而是它不适合你们企业。 制造业企业的仓库管理场景,随着制造业企业规模的扩大,逐步精细化,企…

JAVA基础学习笔记-day12-泛型

JAVA基础学习笔记-day12-泛型 1. 泛型概述1.1 泛型的引入 2. 使用泛型举例2.1 集合中使用泛型2.2 相关使用说明 3. 自定义泛型结构3.1 泛型的基础说明3.2 自定义泛型类或泛型接口3.2.1 说明3.2.2 注意 3.3 自定义泛型方法3.3.1 说明 4. 泛型在继承上的体现5. 通配符的使用5.1 通…

C语言KR圣经笔记 5.6指针数组;指针的指针

5.6 指针数组;指针的指针 因为指针本身也是变量,所以它们也能像其他变量一样保存在数组里面。我们写个程序来说明,该程序将一些文本行按照字母顺序排列,算是 UNIX 程序 sort 的精简版本。 在第三章中,我们介绍了对一…

10-链表-删除排序链表中的重复元素 II

这是链表的第10篇算法,这是上一篇文章的加强版,力扣链接。 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,…

Facebook选品方法大揭秘,这几个最畅销类目别错过!

现在越来越多的卖家开始做社媒电商,其中很多人都想在 Facebook 这个平台上分一杯羹,而 Facebook选品对于这些商家来说非常重要。俗话说,七分靠选品,三分靠运营,想成功入局 Facebook,选品选的好&#xff0c…

肠道重要属——芽孢杆菌属,益生与病原双标签

谷禾健康 芽孢杆菌属(Bacillus)是革兰氏阳性、杆状、芽孢杆菌科细菌的一个属,属于厚壁菌门。 芽孢杆菌属物种可以是专性需氧微生物(依赖氧气)或兼性厌氧微生物(具有需氧或厌氧的能力)。当使用或存在氧气时,它们的过氧化氢酶检测呈…

Stable Diffusion汉化插件

今天为大家介绍Stable Diffusion的两种UI汉化包,一种是汉化包,就中文界面,方便大家对于繁杂的参数的模型的操作,一种是中英文对照界面,在中文提示下,同时显示英文,不但方便设置也同时学习了英文…

MySQL进阶篇(一)存储引擎

一、MySQL 体系结构 (1) 连接层 最上层是一些客户端和链接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念&#xff…

如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板

文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

这款IDEA插件真的爽,白嫖真香

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

XD6500S一款串口SiP模块 射频LoRa芯片 内置sx1262

1.1产品介绍 XD6500S是一款集射频前端和LoRa射频于一体的LoRa SIP模块系列收发器SX1262 senies,支持LoRa⑧和FSK调制。LoRa技术是一种扩频协议优化低数据速率,超长距离和超低功耗用于LPWAN应用的通信。 XD6500S设计具有4.2 mA的有效接收电流消耗&#…