闭包

Swift ——闭包 之前在代码的书写过程中,我们已经或多或少的接触过函数,函数本身也有自己的类型,它由形式参数类型,返回类型组成。如果将函数传递给a变量,那么就可以借助a来调用方法,这里addTwoInts代表函数类型。如果出现了同名函数,但是返回值或者参数不一样,那么就需要指明函数类型。否则就会报 ambiguous user of *** 错误,因为这个时候编译器不知道要给a赋值哪一个参数。把函数赋值给a,那么a里面储存的是什么呢? 运行后打印a,这里看懂存储的是函数类型.这里函数类型也是引用类型,当把函数赋值给a的时候, 阅读详情

闭包其实我们经常会在代码中遇到,只是我们可能没有发现而已,我们经常用到的Ajax请求,定时器,事件监听器,跨窗口通信,以及其它的异步(或同步)任务中,只要使用了回调函数,实际上就是使用了闭包。

首先在了解闭包之前,我们先要了解几个概念,作用域和执行上下文以及作用域链

作用域链

JS中所有的函数都有它的执行环境,当它执行的时候会将当前环境压入环境栈中,如果执行完毕,会将当前环境弹出,每个执行环境中都有它对应的变量对象,里面保存着函数作用域中定义的变量和还有其他的信息,作用域链最顶端是当前执行环境的变量对象,下一个是上一层的变量对象,一直到最顶端window对象。

作用域
js中作用域包括全局作用域和函数作用域
执行上下文

执行上下文即当前代码的执行环境
执行上下文可以描述成式一个包含变量对象(对应全局)/活动对象(对应函数)、作用域链和 this 的数据结构。

闭包

一般为函数嵌套函数的形式,内层函数可以访问到外层函数的变量,外层函数的变量访问不到内层函数的变量,外层变量对象在内层的作用域链上

存在的问题:外面的函数执行完毕后里面的变量对象仍旧存在,容易导致内存泄漏

实例代码:

function f1(){
 var n=99;
 function f2(){
    alert(n);
 }
}
var result=f1();
result();

代码的弹出结果为99

其中的f1()就是一个闭包函数

闭包的使用场景

  • 模拟块级作用域
  • 模块化开发
    模块化开发的特点:必须有外部的封装函数,该函数至少被调用一次,封闭函数必须返回一个内部函数。
    模块化开发的优点:灵活,多人写协作互不干扰,可维护性好

举个例子:

for(var i=0;i<=5;i++)
    {
      setTimeout(function () {
          console.log(i);
      },i*1000);
    }

你觉得输出结果会是什么呢?
间隔为1秒,相继输出0,1,2,3,4,5

答案是不对
正确的输出结果应该是间隔为1秒,相继输出5个6

原因:因为变量i是在全局作用域中共享的,setTimeout中的代码每执行一次都会创建一个闭包,这样就创建了6次闭包,但是因为代码真正执行输出的时候,i已经是循环退出条件6了,所以输出结果是6个6

更改后的代码:

for(var i=0;i<=5;i++)
    {
        (function (i) {
            setTimeout(function () {
                console.log(i);
            },i*1000);
        })(i);
    }

这样代码的运行结果就和想象中的一样了,其实还有一种办法

for(let i=0;i<=5;i++)
    {
            setTimeout(function () {
                console.log(i);
            },i*1000);
    }

这样也可以的原因是let会劫持作用域,并在这个块作用域上声明一个变量,后者应该比较酷炫吧

那么怎么解决闭包引起的内存泄漏问题呢?

在函数结束之前给闭包中使用的变量赋值为null,以便后期垃圾收集器回收内存。

JS的垃圾回收机制

JS的垃圾回收机制分为两种,分别为标记清除和引用计数

标记清除:垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及环境中的变量引用的变量的标记,如果此时还存在有标记的变量就视为准备删除的变量,因为环境中的变量无法访问到这些变量,最后垃圾收集器完成内存清理,销毁这些变量并回收内存。

引用计数:记录每一个值被引用的次数,当声明一个变量并将一个引用类型值赋给该变量时,该变量的引用次数加一,如果一个值又被赋给另外一个变量,则该值的引用次数减一,当这个值的引用次数为0时,就说明没有办法再访问这个值了,就可以回收该变量的空间,当垃圾收集器下次运行时,它会释放这个值占用的内存。

【FPGA】Robei EDA的使用(10)————如何更新EDA的使用license #海卑而下,能聚众水;学问笃实,以生光辉。 有的时候,有些问题自己通过查找资料解决,宁愿磨难一下,走点弯路,但收获更深刻的认知;不过,有些问题,问一下别人,可能会避免自己耗费过多时间做无用工,这些问题问会的人是极好的。但是怎样把握这个问题的类型,大约只能靠经验了~ (问我为何出此感言,谁叫我纠结了两天的问题,被人家一句话解决,我这个恨啊) ————————————————————正文开始的分割线———————————————— Robei EDA在使用上会有一个注册码,这个license在获取之后,每一次的 阅读详情

相关推荐

使用 EasyExcel 实现 百万级数据导入导出

在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。很多问题只要这一次解决了,总给复盘记录,后期遇到同样的问题就好解决了。好啦,废话不多说开始正文!1.如此大批量数据的导出和导入操作,会占用大量的内存实际开发中还应限制操作人数。2.在做大批量的数据导入时,可以使用jdbc手动开启事务,批量提交。

houxian1103的博客 2699

python基础2——闭包函数

一、闭包的概念 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量。 简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。 二、闭包函数的必要条件: 1、闭包函数必须返回一个函数对象 2、闭包函数返回的那个函数必须引用外部变量(一般不能是全局变量),而返回的那个函数内部不一定要return 一般情况下,在我们认知当中,如果一个函数结束...

qissme的博客 345

uniapp中renderjs实战:手把手教你实现SSE即时通讯(附完整代码)

本文通过一个完整的实战案例,详细讲解了如何在uni-app中使用RenderJS实现SSE即时通讯功能。文章剖析了RenderJS作为Vue视图层强力补充的原理,并提供了包含自动重连、状态管理等健壮性设计的完整代码,帮助开发者突破框架限制,高效集成浏览器原生API。

weixin_29005499的博客 188

闭包的介绍及使用

目录 一、闭包 1. 闭包的介绍 2. 闭包的构成条件 3. 闭包示例 4. 闭包的作用 二、闭包的使用 1. 实现步骤 2. 代码实现 三、nonlocal修改闭包内使用的外部变量

qq_52262831的博客 3074

CentOS7无网环境实战:MySQL8.0完整离线安装与避坑指南(附依赖包下载)

本文详细介绍了在CentOS7无网环境下MySQL8.0的完整离线安装流程,包括依赖包获取、系统预处理、MySQL二进制安装、服务配置与优化等关键步骤。特别针对离线安装的特殊需求,提供了从依赖包下载到服务调优的全链路解决方案,帮助用户在企业内网或隔离环境中高效部署MySQL数据库。

bush的博客 174

电子产品设计中EFT防护的关键技术与实践

本文深入探讨了电子产品设计中EFT(快速瞬变脉冲群)防护的关键技术与实践。文章从EFT干扰的原理入手,系统阐述了通过优化PCB布局与地平面设计、构建电源与信号端口滤波防护电路、精选核心器件以及实施软件容错策略,来构建多层次、系统性的抗干扰防线,助力产品稳定通过严苛的电磁兼容测试。

e4f5g6h的博客 786

什么是闭包?在实际开发中是如何使用闭包?

闭包是能够读取其他函数内部变量的函数,由于在JavaScript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解为定义在一个函数内部的函数。 闭包的作用就是保护变量不被污染,在实际开发中,经常使用到闭包的地方就是封装,如:vue组件、网络请求二次封装等。闭包的作用就是保护变量不被污染,在实际开发中,经常使用到闭包的地方就是封装,如:vue组件、网络请求二次封装等。

return_o的博客 1548

不用写代码!用AIStarter 5.0.0离线包部署InfiniteTalk的完整指南(Windows/Mac/Linux全平台)

本文详细介绍了如何使用AIStarter 5.0.0离线包在Windows、Mac和Linux平台上零代码部署InfiniteTalk数字人。从环境准备、离线资源获取与验证,到全平台部署实操指南,提供了完整的本地化安装流程和优化建议,帮助用户快速实现AI项目的一键部署。

weixin_30275415的博客 273

闭包的使用场景

一、闭包 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,闭包就是能够读取其他函数内部变量的函数。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 比如下面的代码: function f1() { var n = 999; function f2() { console.log(n); } return f2; } var result = f1(); result();//999 函数f2就被包括在函数f1内部,这时f1内部

weixin_48659263的博客 1万+

ISA-95(S95)标准详解

ISA-95是制造业系统集成的“通用语言”,通过分层模型和信息流规范,打通企业计划层与设备控制层,成为实现数字化工厂的核心标准之一。其与ISA-88的协同应用,可进一步优化生产执行与资源管理的效率。标准,旨在解决企业商业系统(如ERP)与工业控制系统(如MES、SCADA)之间的集成问题。

「东哥说MES」 专注于MES制造执行系统,为你拆解核心架构、功能模块及与ERP/PLC的集成逻辑。提供从入门到精通的系列干货、精选行业报告与实用工具,构建你的数字化知识体系,关注我,用实战经验照亮你的数字化之路。 3736

基于STM32F407的定时器以及定时器中断的实现

基于STM32F407的定时器以及定时器中断的实现

weixin_57941207的博客 5228

闭包的使用

闭包

Agress726901的博客 214

手把手教你低成本复刻大疆C板缓启动电路(附原理图与选型清单)

本文详细介绍了如何低成本复刻大疆C板缓启动电路,包括核心器件选型、电路搭建与调试实战、参数优化方法论及进阶改进思路。通过替代型号和优化设计,实现功能相近的缓启动电路,成本不到原方案的1/3,适合电子爱好者、在校学生和预算紧张的硬件工程师。

weixin_29197051的博客 397

闭包:什么是闭包、闭包的作用、闭包的解决

学习闭包我们要清楚函数作用域、内存回收机制、作用域继承。作用域我们可以认为它是一个封闭的盒子,只让它在这个盒子里面进行操作,也可以称这个盒子为独立作用域。在js中,一个函数要执行时就会在内存里面创建一个独立作用域————封闭的盒子。比如在函数中第一一个变量,只能在函数这个独立作用域中使用(也就是封闭的盒子)。只要跳出这个作用域,就找不到该变量了。而且函数执行完毕之后,这个独立作用域或(封闭的盒子)就会删除。有一种情况下这个封闭的盒子是不会删除的,那就是“闭包”,后面会讲到。内存回收机制就是不在用到的内存空间

weixin_56266471的博客 6万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【集合论】关系闭包 ( 自反闭包 | 对称闭包 | 传递闭包 )

一、关系闭包 、 二、自反闭包 、 三、对称闭包 、 四、传递闭包 、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【集合论】关系闭包 ( 关系闭包求法 | 关系图求闭包 | 关系矩阵求闭包 | 闭包运算与关系性质 | 闭包复合运算 )

一、闭包求法 、 二、求闭包示例 ( 关系图角度 ) 、 三、求闭包示例 ( 关系矩阵角度 ) 、 四、闭包运算与关系性质 、 五、闭包复合运算 、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

什么是闭包,对闭包的理解,闭包的用途及优缺点

什么是闭包,对闭包的理解,闭包的用途、优缺点及注意事项

weixin_48644617的博客 3万+

Swift 闭包

必报是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)一级其他一些编程语言中的匿名函数(Lambdas)比较相似。闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。Swift 会为你管理在捕获过程中涉及到的所有内存操作。在Swift 的闭包表达式拥有简洁的风格,并鼓励在常见场景中进行语法优化,主要优化如下return。

xiaoxiaobukuang的专栏 2089

闭包、闭包应用场景

闭包、闭包应用场景

weixin_45463061的博客 4862

闭包、自动闭包、逃逸闭包

闭包是自包含的功能块,可以在代码中被传递和使用,它能够捕获和存储其所在上下文中的任何常量和变量的引用。在 Swift 中,闭包类似于其他语言中的匿名函数(lambda)或块(blocks),但提供了更灵活和强大的功能。

Made In SQL 1416

用代码实现自反闭包,对称闭包,传递闭包

目录 一、自反闭包 二、对称闭包 三、传递闭包 四、代码实现 五、运行结果 六、总结 一、自反闭包 理论很简单,就是R并上它的对角线全为一即可,比较容易实现 二、对称闭包 就是R并上它的逆 三、传递闭包 这个在上一篇博客上也说啦,在此不再赘述 四、代码实现 #include<stdio.h> #define N 100 int main() { int n,i,j,k,a[N][N],b[N][N],c[N][N]={0}; scanf("%d",&

crhxiyhx的博客 7237

自反闭包、对称闭包、传递闭包、正闭包、克林闭包(个人感悟)

自反闭包、对称闭包、传递闭包、正闭包、克林闭包、自反传递闭包、离散数学、自动机

归忆_AC的博客 6551

闭包:什么是闭包,闭包有什么用

函数之间的嵌套,内层函数能引用到外层函数的变量或者形参。学习闭包我们要清楚函数作用域、内存回收机制、作用域继承。作用域我们可以认为它是一个封闭的盒子,只让它在这个盒子里面进行操作,也可以称这个盒子为独立作用域。在js中,一个函数要执行时就会在内存里面创建一个独立作用域————封闭的盒子。比如在函数中第一一个变量,只能在函数这个独立作用域中使用(也就是封闭的盒子)。只要跳出这个作用域,就找不到该变量了。而且函数执行完毕之后,这个独立作用域或(封闭的盒子)就会删除。

m0_74454396的博客 1092

什么是闭包,闭包是怎么产生的,闭包的应用在什么地方

目录 什么是闭包 闭包是怎么产生的 闭包的使用场景 使用闭包的注意点 一、什么是闭包 简单来说: 闭包就是能够读取其他函数内部变量的函数。 由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。 所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。 创建闭包最常见方式,就是在一个函数内部创建另一个函数。一个简单...

qq_42817747的博客 7102

关系的闭包

闭包: 设 是 上的关系,如果 不具有 自反 (对称,传递)性, 我们希望 添加 一些 有序对,构成 具有上述性质,同时我们希望最小。 数学语言描述: 1. 具有自反(对称,传递)性质 2. 3. 任何包含 的自反(对称,传递)闭包,都有 闭包的记号: 自反闭包: 对称闭包: 传递闭包: 集合观点: 对于 上的关系,有 ...

海绵的博客 4993
上一篇: 浅谈web安全
下一篇: promise
codezha
博客等级 码龄10年 28粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值