什么是闭包?
- 函数在执行的过程中,先从自己内部找变量
- 如果找不到,再从创建当前函数所在的作用域(词法作用域)去找, 以此往上
- 注意找的是变量的当前的状态
函数连同它作用域链上的要找的这个变量,共同构成闭包
- 实例一
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就一直存在
网友评论