闭包是什么?满足以下两个条件:
1. 闭包是一个函数
2. 函数里面声明了变量,函数里面还包含了可以访问到这个局部变量的内部函数
闭包的作用:
【隐藏变量】:不能直接在全局访问这个变量。达到 【间接访问一个变量】的目的。为了使这个变量不能轻易被访问或修改。
例子解析:
假设做一个游戏,在写其中关于「还剩几条命」的代码。
如果不用闭包,你可以直接用一个全局变量:
window.lives = 30 // 还有三十条命
这样看起来很不妥。万一不小心把这个值改成 -1 了怎么办。所以我们不能让别人「直接访问」这个变量。怎么办呢?
用局部变量。
但是用局部变量别人又访问不到,怎么办呢?
暴露一个访问器(函数),让别人可以「间接访问」。
!function(){
var lives = 50
window.奖励一条命 = function(){
lives += 1
}
window.死一条命 = function(){
lives -= 1
}
}()
那么在其他的 JS 文件,就可以使用 window.奖励一条命() 来涨命,使用 window.死一条命() 来让角色掉一条命。
PS: !function(){ }() 是立即执行函数。因为 ! 运行优先级别最高;
注意点:
内部函数需要在外部函数运行后才能访问到。
如果外部函数还没运行,内部函数将访问不到。以下闭包外部函数为具名函数 changeLives( )。在未运行这个外部函数之前,访问内部函数 addi 或者 redu 就会返回 undefined
function changeLives(){ var lives = 50 addi = function(){ lives += 1; return lives } redu = function() { lives -= 1; return lives } }
先运行外部函数changeLives( ) 后,就可以访问内部函数addi 或 redu 了