了解js闭包

闭包的生成有三个必要条件

      1. 在函数 A 内部直接或者间接返回一个函数 B
      2. B 函数内部使用着 A 函数的私有变量(私有数据)
      3. A 函数外部有一个变量接受着函数 B

形成了一个不会销毁的函数空间举个例子

function a() {
      // 这个 num 变量就是函数 a 的私有变量
      var num = 100
      return function b() {
        console.log(num)
      }
    }
    // res 接受的是 a 函数执行以后的返回值
    // res 接受的就是函数 a 内部返回的一个复杂数据类型(函数b)
    // 导致函数 a 的执行空间不会销毁
    var res = a()
    // 从现在开始, res 随时可以是一个 函数a 里面返回的 函数b
    // res 随时可以调用
    res()
    // 当 res 调用的时候, 打印 num
    // 打印出来的就是 a 函数内部的私有变量 num 的值

那么这个时候就会形成所谓的闭包空间

     我们管这个不会销毁的 a 函数的执行空间叫做 闭包空间
     把函数 a 里面返回的 函数 b, 叫做函数a 的 闭包函数
     官方给的定义有一句话: 闭包 => 函数内部的函数

那么这个时候就不得不说一下闭包的特点

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

      return function b() {
        console.log(num)
      }
    }

    // 1. 延长变量的声明周期
    // var res = a()
    // res 接受的就是 a 函数内部返回的函数 b
    // a 函数的函数执行空间就不会销毁
    // a 函数执行空间内部的 num 变量也不会销毁
    
    // 2. 访问函数内部的私有变量
    // console.log(num)
    // 报错, 没有这个变量
    // 因为 num 是函数 a 的私有变量, 在函数内部可以访问
    // 在函数外部不能访问函数内部的私有变量
    // var res = a()
    // res 接受到的是 a 函数内部的函数 b
    // res() 的时候, 执行的一句话就是 console.log(num)
    // 当函数 b 内部访问 num 变量的时候, 如果自己没有
    // 就会去 b 函数的父级作用域查找
    // b 函数的父级作用域就是 a函数的执行空间
    // 里面就有一个 num 变量可以被访问
    // 就能打印出 100
    // res()
闭包的函数的致命缺点
     因为当一段内存空间中有一个不会被销毁的东西一直存在
     那么就会出现内存占用, 如果过多, 就会导致内存溢出
     那么结果就是 内存泄漏         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值