Javascript闭包函数理解

闭包概念

  • 有一个 A 函数,再 A 函数内部返回一个 B 函数
  • 再 A 函数外部有变量引用这个 B 函数
  • B 函数内部访问着 A 函数内部的私有变量
函数作用域(闭包前置知识)

在聊闭包之前先回顾一下函数,函数有两个阶段:a.定义阶段,b.调用阶段。要学会闭包函数一定要弄懂。

函数定义阶段
  1. 开辟一个 存储空间
  2. 把函数体内的代码一模一样的放在这个空间内(不解析变量)
  3. 存储空间 的地址给函数名
函数调用阶段
  1. 按照函数名的地址找到函数的 存储空间

  2. 形参赋值

  3. 预解析

  4. 在内存中开辟一个 执行空间

  5. 将函数 存储空间 中的代码拿出来在刚刚开辟的 执行空间 中执行

  6. 执行完毕后,内存中开辟的 执行空间 销毁

function fn() {
  console.log('我是 fn 函数')
}

fn() 
  • 函数执行的时候会开辟一个 执行空间 (暂且叫他 xxff00
  • console.log('我是 fn 函数') 这个代码就是在 xxff00 这个空间中执行
  • 代码执行完毕以后,这个 xxff00 空间就销毁了
函数执行空间
  1. 每一个函数会有一个 存储空间
  2. 但是每一次调用都会生成一个完全不一样的 执行空间
  3. 并且 执行空间 会在函数执行完毕后就销毁了,但是 存储空间 不会
  4. 那么这个函数空间执行完毕就销毁了,还有什么意义呢?
  • 我们可以有一些办法让这个空间 不销毁
  • 闭包,就是要利用这个 不销毁的执行空间
函数执行空间不销毁
  1. 函数的 执行空间 会在函数执行完毕之后销毁

  2. 但是,一旦函数内部返回了一个 引用数据类型,并且 在函数外部有变量接受 的情况下

  3. 那么这个函数 执行空间 就不会销毁了

    function fn() {
      var num = 100
      console.log('你好 世界')
      // 返回了一个复杂数据类型
      return [1, 2, 3]
    }
    // res 接受的就是 函数fn 返回的那个复杂数据类型(一个数组)
    //   => res 接受的是 函数fn 执行空间里面那个数组的地址xxff11
    var res = fn()
    /*
      res 接受的是 函数fn 的执行空间内的一个数组
        + 只要这个数组还存在, 就表示这个函数执行空间没有销毁
        + 因为一旦函数执行空间销毁了, 那么这个数组也就没有了
        + 所以这个函数执行空间不能销毁
    */

    res = null
    /*
      当 res 指向别的位置了, 不在是 xxff11 空间里面的那个数组了
        + 也就是函数执行空间内返回的复杂数据类型, 外面没有接受的
        + 那么这个函数执行空间就销毁了
    */

闭包

不销毁的空间
  • 闭包的第一个条件就是利用了不销毁空间的逻辑

  • 只不过不是返回一个 对象数据类型

  • 而是返回一个 函数数据类型


    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 的值

如何产生闭包?
  • 在嵌套内部函数定于并引用父函数的属性时,就产生了闭包。
  • 产生闭包必须要有嵌套函数,以及子函数引用父函数的属性或者变量才能产生闭包。
闭包的特点
  • 为什么要叫做特点,就是因为他的每一个点都是优点同时也是缺点
  1. 延长了变量的生命周期
  • 优点: 因为执行空间不销毁, 变量也没有销毁
  • 缺点: 因为执行空间不销毁, 会一直存在在内存中
  1. 可以访问函数内部的私有变量
  • 优点: 利用闭包函数可以访问函数内部的私有变量
  • 缺点: 执行空间不会销毁, 会一直存在在内存中
  1. 保护私有变量(只要是函数, 就有这个特点)
  • 优点: 保护私有变量不被外界访问
  • 缺点: 如果向访问, 必须要利用闭包函数
闭包的函数的缺点 致命
  • 因为当一段内存空间中有一个不会被销毁的东西一直存在
  • 那么就会出现内存占用, 如果过多, 就会导致内存溢出
  • 那么结果就是 内存泄漏
    闭包的作用
  • 就是当你需要延长变量的声明周期的时候
  • 或者你需要访问某一个函数内部的私有数据的时候
  • 你可以使用 闭包 函数来解决

关键字:闭包 函数

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值