闭包

我是这样理解闭包的:说的通俗点就是闭包是嵌套的内部函数,也就是说闭包是包含被引用变量的对象。

那么如何产生一个闭包呢?

当嵌套的内部函数引用了外部函数的变量或者函数时,就产生了闭包。

可以看出,闭包的产生需要两个必要条件:

1.函数的嵌套

2.内部函数引用了外部函数的数据

如下:


这样就产生了一个闭包,内层的fun1函数引用了外部的fun函数的变量a

接下来我们让这段代码运行起来


打开控制台 看看闭包,我们先标记这样的断点


fun1中有了a

这样我们就通过内部函数引用外部函数的数据(可以是变量,函数等)就可以产生闭包


那么,我们为什么要使用闭包呢。

第一:在JS中,函数内部可以一层一层的向外读取变量直至全局变量,但有时候,我们需要倒过来,从函数外部读取函数内部的变量,这时候就需要闭包了。

就比如上面的例子,按照正常情况我们是不能够访问函数内部的变量的。但此时我们需要知道函数内部变量。我们就通过闭包读取到函数内部的变量,并将其返回(return)

就可以访问到了。

第二:在JS中,我们使用一个函数时,当它执行完,就会立即销毁,但此时出于某些需求我们需要暂时保存或者使用函数内的变量。此时,我们就可以使用闭包让函数内部的变量在执行完后,仍然在内存中,这样就可以延长局部变量的生命周期。

看下面的例子:


它的输出结果是2和3。那么说明,在每次函数执行完后,这个a变量并没有被销毁。

为什么会这样?

因为闭包没有消失的根本原因是 var result=fun()这句话,为什么呢,因为在函数执行完后,fun1这个函数本应该释放,然后被当做垃圾回收,但此时,由于result的存在,result指向了fun1这个函数对象,而return fun1 是返回的fun1的地址值。所以当fun1被释放之后,result还在指向着它函数对象(fun1的地址值),而函数对象关联着闭包,闭包里面有a,所以不会被当作垃圾回收。

在知道了闭包的定义和作用后,我们需要知道闭包的生命周期。

闭包在何时产生:闭包在内部函数定义执行完时就已经产生了,这里要注意,不是调用,而是定义。比如上面实际情况中在var a=1时,就已经产生了,是因为函数提升,内部函数已经创建了,但是如果变成 var f=function(){}这种,就是在这个完全定义完才会产生。根据不同情况而视

闭包何时死亡:包含闭包的对象成为垃圾对象时。比如上面的result=null

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 相信学习 JavaScript 的同学都知道「闭包(Closure)」,这个概念在 JavaScript 中是非常...
    ikook阅读 566评论 0 1
  • 前言 对于js中的闭包,无论是老司机还是小白,我想,见得不能再多了,然而有时三言两语却很难说得明白,反正在我初学时...
    itclanCoder阅读 4,306评论 1 11
  • 什么是闭包? 简单的来说闭包就是函数。那函数是不是闭包呢? 网上有一句话js函数皆是闭包。我觉得这句话是不太准确。...
    DIV豪阅读 498评论 0 1
  • 什么是闭包 在函数外部能够读取其他函数内部变量的函数。 通俗理解的闭包: 一个内部函数引用了外部函数的变量,外部函...
    小五同学H阅读 178评论 0 0
  • 闭包 定义 官方:内部函数对外部函数作用域里变量的引用 个人理解:对于一个内部函数,如果它引用了外部函数的参数和局...
    5a031e82bbd5阅读 347评论 0 1

友情链接更多精彩内容