闭包是由函数和函数内部能访问到的变量组成的,在js中函数内部可以直接读取全局变量,而当我们想要得到函数内局部变量的时候,就需要在函数的内部再定义一个函数,并把子函数作为函数返回值返回出去,那么父函数就可以说使用子函数内的局部变量,如以下代码,f1函数就可以读取f2函数内的局部变量
function f1(){
var n=999;
function f2(){
alert(n); }
return f2;
}
var result=f1();
result(); // 999
假设我们在做一个游戏,在写其中关于「还剩几条命」的代码。
如果不用闭包,你可以直接用一个全局变量:
window.lives = 30 // 还有三十条命
这样看起来很不妥。万一不小心把这个值改成 -1 了怎么办。所以我们不能让别人「直接访问」这个变量。怎么办呢?
用局部变量。
但是用局部变量别人又访问不到,怎么办呢?
暴露一个访问器(函数),让别人可以「间接访问」。
代码如下:
!function(){ var lives = 50
window.奖励一条命 = function(){
lives += 1 }
window.死一条命 = function(){
lives -= 1 }
}()
闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会被垃圾回收。