javascript闭包

1. 产生闭包的条件?

  • 1.函数嵌套
  • 2.内部函数引用了外部函数的数据(变量/函数)
    3.执行外部函数,也就是执行了内部函数定义

2. 闭包到底是什么?

  • 使用chrome调试查看
  • 理解一: 闭包是嵌套的内部函数(绝大部分人),也就是fn2函数
  • 理解二: 包含被引用变量(函数)的对象closure(极少数人)
  • 注意: 闭包存在于嵌套的内部函数中
<script type="text/javascript">
  function fn1 () {
    var a = 2//此时已产生了闭包,因为有函数声明,a:undefined
    var b = 'abc'
    function fn2 () { 
      console.log(a)//a=2
    }
    // fn2()//执行函数定义就会产生闭包(不用调用内部函数)
  }
  fn1()
</script>

常见的闭包:

  1. 将函数作为另一个函数的返回值
  function fn1() {
    var a = 2
    function fn2() {
      a++
      console.log(a)
    }
    return fn2
  }
  var f = fn1()
  f() // 3
  f() // 4

首先去调用fn1函数,当执行到a=2时,由于函数声明提前,产生闭包,此时a为undefined,然后返回函数fn2给变量f,执行f()时,闭包里的a++,变成3,再++,变成4.
整个过程产生了一个闭包,因为外部函数fn1执行了一次,本质上也就是fn2的函数定义执行了一次,而f()调用了两次是执行了两次函数,不是执行函数定义两次,所以产生一个闭包。
2. 将函数作为实参传递给另一个函数调用

 function showDelay(msg, time) {
    setTimeout(function () {
      alert(msg)
    }, time)
   }
  showDelay('atguigu', 2000)

产生了一个闭包,闭包里面有msg这个属性。

闭包的作用

  1. 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)
  2. 让函数外部可以操作(读写)到函数内部的数据(变量/函数)

问题:

  1. 函数执行完后, 函数内部声明的局部变量是否还存在?
    一般是不存在, 存在于闭中的变量才可能存在(为什么是可能,前提条件就是闭包所处的对象不是垃圾对象,被别的变量引用着)
    在这里插入图片描述
    如上例所示,fn2执行完自动释放,fn3执行完也是自动释放,fn3里面包含着闭包对象,但是后面f指向fn3这个对象,fn3这个变量是释放掉了,但是fn3指向的闭包对象又赋值给了f,所以闭包在内存中还是存在的,在外面全局是可以访问的。
    在这里插入图片描述
    这样的话执行完fn2和fn3都释放掉了,没有闭包了。
  2. 在函数外部能直接访问函数内部的局部变量吗?
    不能, 但我们可以通过闭包让外部操作它

闭包的生命周期

  1. 产生: 在嵌套内部函数定义执行完时就产生了(不是在调用时的函数执行)
  2. 死亡: 在嵌套的内部函数成为垃圾对象时,即包含闭包的函数对象成为垃圾对象,f=null
<script type="text/javascript">
  function fn1() {
    //此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
    var a = 2
    function fn2 () {
      a++
      console.log(a)
    }
    return fn2
  }
  var f = fn1()
  f() // 3
  f() // 4
  f = null //闭包死亡(包含闭包的函数对象成为垃圾对象)
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值