闭包

55 阅读1分钟
  • 闭包:有权访问另一个函数作用域中的变量的函数 要知道,平时我们在全局中是无法访问函数中的变量的如
 function fn() {
    var a = 77
  }
  console.log(a)//这样是访问不了函数中的变量a的

image.png 而闭包就很好的解决了这个问题

 function fn() {
    var a = 77

    function fm() {
      console.log(a)
    }//这个函数决定被访问变量的操作方式
    return fm
  }
  f = fn()
  /* 运行fn的返回值为function fm(){
        console.log(a)
      }所以f等于这个函数 */
  console.log(f)
  f() //这个时候就能访问函数内部变量a

image.png

如果一个函数的变量能被其他函数访问,就称这个函数为闭包,这里fn就是闭包

外部操作闭包来间接访问函数内部的变量(只能访问,不能决定如何操作这个变量),只有闭包可以决定这个变量的操作方式(通过操作返回的那个函数决定如何操作变量)

  • 利用函数自调用,每次调用内部的局部变量或者形参都是独立的 来保存一些临时数据
 var arr = []
  for (var i = 0; i < 5; i++) {
    function fn() {
      console.log(i)
    }
    arr[i] = fn
  }
  arr[2]() //5,因为for循环没有块级作用域,所以在函数运行时,for循环已经完了,这里的i5,无法实现实时打印i的值

image.png

 var arr = []
  for (var i = 0; i < 5; i++) {
    (function (index) {
      arr[index] = function fn() {
        console.log(index)
      }
    })(i)//利用函数闭包可以实时获取i的值
  }
  arr[2]() 
  arr[3]() 

image.png