了解闭包

一、在了解闭包之前我们需要了解的js概念:

  1. 作用域:
    在Javascript中,作用于分为全局作用域和函数作用域,全局作用域在整个页面起作用,函数作用域在固定的代码片段才能被访问。同时作用域有上下级关系,一般来说,变量取值是到创建这个变量的函数的作用域内进行取值的。
    例如:
    在这里插入图片描述
    fn和bar作用域是父子级的关系,bar()里面的a变量取值的时候在bar的作用域内查找到a=1000,因为作用域的隔离变量作用,不同作用域下同名变量不会影响。
  2. 作用域链:
    如下图在bar作用域内没有查到a和b的值,那么就会向上级作用域查找,直至找到全局作用域,这样的链条就形成了作用域链。bar函数在fn函数内部,相当于fn是bar的父亲,那么变量相当于父亲的名,bar可以使用父亲的名。
    例如:
    在这里插入图片描述
  3. js内存回收机制:
    在函数储存空间中,函数会将函数变量储存在栈内存,然后会在堆内存中开辟一个存储空间,将代码内容进行存储,不执行,变量也不解析,把这个空间地址赋值给变量名,当函数调用的时候,会在堆内存中开辟一个执行空间,此时在执行空间进行解析,执行完毕后,执行空间销毁。

二、如何创建一个不会销毁的函数执行空间?

  1. 当函数内部返回一个复杂数据类型
  2. 在函数外部有变量接受这个复杂数据类型的时候

符合这两个条件,函数的执行空间不会被销毁
例如:
在这里插入图片描述
fn函数内部返回了一个复杂的数组数据类型,res这个变量承接了fn的返回值,此时这个函数的执行空间不会被销毁

三、什么是闭包?闭包生成的必要三个条件

  1. 闭包的概念:
    能够读取其他函数内部变量的函数,简单理解为内部函数能够持有外部函数变量的引用。这就相当于A(外部函数)的钱财(变量)是A私有的,但是当A(外部函数)内部return了儿子B(内部函数)以后,B就可以使用A的钱财(变量)。同时如果想要B的钱财不被用完销毁,那么外部需要有一个银行账户(变量)接受着儿子B。
  2. 闭包的三个条件:
    1,A函数内部直接或者间接返回一个函数B
    2,B函数内部使用着A函数作用域内的私有变量
    3,A函数外部有一个变量接受着函数B

也就形成了一个不会销毁的函数执行空间
我们管这个不会销毁的A函数的执行空间叫做闭包空间,把函数A里面返回的函数B,叫做函数A的闭包函数。

当你只需要访问一个数据的时候,可以使用直接返回或者间接返回,直接的返回一个函数,return function b(){}
直接返回例子:
在这里插入图片描述
但是当你需要访问多个私有数据的时候,我们就需要间接返回,返回的函数是一个对象,包含了多个闭包函数。
间接返回例子:
在这里插入图片描述
四、闭包的特点(优点和缺点并存):

  1. 延长了变量的生命周期
    优点: 因为执行空间不销毁, 变量也没有销毁
    缺点: 因为执行空间不销毁, 会一直存在在内存中
  2. 可以访问函数内部的私有变量
    优点: 利用闭包函数可以访问函数内部的私有变量
    缺点: 执行空间不会销毁, 会一直存在在内存中
  3. 保护私有变量(只要是函数, 就有这个特点)
    优点: 保护私有变量不被外界访问
    缺点: 如果向访问, 必须要利用闭包函数

五、闭包的函数的缺点【致命】
因为当一段内存空间中有一个不会被销毁的东西一直存在,那么就会出现内存占用, 增大了内存消耗,如果过多, 就会导致内存溢出,那么结果就是 内存泄漏。

六、闭包的应用
1, 就是当你需要延长变量的声明周期的时候
2, 或者你需要访问某一个函数内部的私有数据的时候
你可以使用 闭包 函数来解决

七、闭包的应用场景:

  1. 循环绑定事件
    在这里插入图片描述
  2. 定时器的传参
    在这里插入图片描述
    关键字:闭包、函数、作用域、作用域链
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值