闭包

什么是闭包?

  • 函数在执行的过程中,先从自己内部找变量
  • 如果找不到,再从创建当前函数所在的作用域(词法作用域)去找, 以此往上
  • 注意找的是变量的当前的状态

函数连同它作用域链上的要找的这个变量,共同构成闭包

  • 实例一
function car(){
  var speed = 0
  function fn(){
    speed++
    console.log(speed)
  }
  return fn
}

var speedUp = car()
speedUp()   //1
speedUp()   //2

fn和变量speed构成一个闭包

  • 实例二
!function(){

  var lives = 50

  window.addOneLife = function(){
    lives += 1
    console.log('当前lives:', lives)
  }

  window.reduceOneLife = function(){
    lives -= 1
    console.log('当前lives:', lives)
  }

}()
addOneLife() //51
addOneLife() //52

function(){lives += 1;console.log('当前lives:', lives)}和lives构成一个闭包
function(){lives -= 1;console.log('当前lives:', lives)}和lives又是一个闭包

闭包有什么用呢?

1.访问其他函数内部的变量

上述实例一的speed以及实例二的lives都是定义在外部函数中,而内部的函数却可以访问到

2.暂存数据

上述实例一中的speedUp 以及实例二中的addOneLife 、reduceOneLife 是全局一直存在的,除非页面销毁。因此他们对应的声明的函数就一直存在,因此函数内部的变量speed,lives就一直存在

你可能感兴趣的:(闭包)