一章教会你闭包到底是什么

首先说说什么是闭包:

**闭包的概念:**
闭包函数:声明在一个函数中的函数,叫做闭包函数。
闭包:内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。

举个例子:

function a() {
      var num = 100
      return function b() {
        console.log(num)
      }
}

比如当需要延长变量的声明周期的时候
输出 a( )这个函数
在执行的时候, 会生成一个函数执行空间在这个函数执行空间,里面有一个 num 变量,等到代码执行完毕, 这个执行空间就销毁了,那么函数里面的私有变量 num 也不存在了。

但是用 var res = a( )用一个变量保存这个函数
原因是 res 接受的就是 a 函数内部返回的函数 b , a 函数的函数执行空间就不会销毁, a 函数执行空间内部的 num 变量也不会销毁。

比如当你需要访问函数内部的私有变量的时候
在函数外部直接 console.log(num)
会报错, 没有这个变量
因为 num 是函数 a 的私有变量

 `var res = a(  )`用一个变量保存这个函数
 `res` 接受到的是 `a 函数`内部的`函数 b` , `res(  )` 的时候, 执行的一句话就是 `console.log(num)` 当`函数 b` 内部访问 `num 变量`的时候,
     如果自己没有就会去 `b 函数`的父级作用域查找  `b 函数`的父级作用域就是 `a函数`的执行空间,里面就有一个 `num 变量`可以被访问就能打印出 100  
res(  )

闭包有保护私有变量(只要是函数就有这个特点)
在函数外部直接 console.log(num)
会报错, 没有这个变量
因为 num 是函数 a 的私有变量, 除了函数内部可以访问,在函数外部不能访问函数内部的私有变量,保护私有变量不被外部变量冲突或修改

总结一下:闭包的特点有以下三个(优点和缺点并存)

1. 延长了变量的生命周期

       优点: 因为执行空间不销毁, 变量也没有销毁
       缺点: 因为执行空间不销毁, 它会一直存在在内存中,占用内存

2. 可以访问函数内部的私有变量

        优点: 利用闭包函数可以访问函数内部的私有变量
        缺点: 执行空间不会销毁, 会一直存在在内存中,占用内存

3. 保护私有变量(只要是函数, 就有这个特点)

       优点: 保护私有变量不被外界访问
       缺点: 如果向访问, 必须要利用闭包函数
  闭包的函数的缺点 **致命**
     因为当一段内存空间中有一个不会被销毁的东西一直存在
     那么就会出现内存占用, 如果过多, 就会导致内存溢出
     那么结果就是 内存泄漏

例子: 内存泄漏
比如说你有一个 盆, 能装 2L 水
你向里面正常导入 2L 水, 是没有问题的
假如这个盆里面被 “闭包” 占据了 0.5L 的空间
你向里面正常导入 2L 水, 那么就会有一部分漏出来了
闭包的作用
就是当你需要延长变量的声明周期的时候
或者你需要访问某一个函数内部的私有数据的时候
你可以使用 闭包 函数来解决
但是有个前提闭包一定要慎用:
如果有别的方法, 尽量不要使用闭包函数
只有到没有招的时候, 我们再使用闭包函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值