每天 10 分钟,学习 JavaScript —— (十七)闭包

174 阅读1分钟

闭包的产生

  • 当一个嵌套的内部函数引用了嵌套的外部函数的变量(函数)时,即产生闭包
    function fn1() {
      var a = 1
      var b = 2
      function fn2() { 
        console.log(a) // 闭包中引用了a,所以闭包中有变量a
      }
    }
    fn1()

常见的闭包

  • 将函数作为另一个函数的返回值
    function fn1() {
      var a = 2
      function fn2() { 
        a++
        console.log(a)
      }
      return fn2
    }
    var f = fn1()
    f() // 3
    f() // 4 因为是执行,所以只产生一个闭包
  • 将函数作为实参传递给另一个函数调用
    function fn1(msg, time) {
      setTimeout(function () {
        console.log(msg)
      }, time)
    }
    fn1(1, 2000)

闭包的作用

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

闭包的生命周期

  • 产生
    • 在嵌套的内部函数定义执行完成时就产生了(不是调用时产生)
  • 死亡
    • 在嵌套的内部函数成为垃圾对象时死亡
    function fn1() {
      var a = 2 // 此时闭包就已经产生
      function fn2() { 
        a++
        console.log(a)
      }
      return fn2
    }
    var f = fn1()
    f() // 3
    f = nul // 此时闭包死亡