闭包的应用:
1.保存(变量)现场
------------------------------------------------
var date = [];
for(var i=0;i<5;i++){
date[i] = function(){
console.log("我的索引位置是: " + i);
}
}
date[0]();
date[1]();
date[2]();
--------------------------------------
函数执行过程 :
--------------------------------------
1.初始化全局环境global environment
1.outer reference = null
2.初始化环境记录
date:undefined
i:undefined
2.执行全局代码
date = []
i = 0 -----> i = 5
通过for循环创建5个匿名函数分别赋值给date数组中的元素,且其scope属性都是global environment
3.执行到date[0](); 初始化date[0]环境
1.outer reference = global environment
2.初始化环境记录
无
4.执行date[0]();
解析i值,即global environment中的i i已经是5
5.下面同理
i的值都是5
******************************************************************
因为匿名函数的外部环境都是global environment,所以只可以在global environment中解析i,而
global environment中的i只能有一个最终值,不可能解析出不同的值,
如果想把for循环中不同的i值都保存下来需要再添加一层环境来保存i的不同的值
******************************************************************
改进版:
--------------------------------------------------
var date = [];
function helper(index){
return function(){
console.log("我的索引位置是: " + index);
}
}
for(var i=0;i<5;i++){
date[i] = helper(i);
}
date[0]();
date[1]();
date[2]();
-------------------------------------------------
代码执行过程 :
-------------------------------------------------
1.初始化全局环境
date:undefined
i:undefined
2.执行全局代码
3.执行到date[0] = helper(0);时
4.初始化helper(词法)环境
1.outer reference = global environment
2.初始化环境记录
index: 0 (这一点很重要,这里i的0这个值通过index = 0被保存在helper词法环境中)
5.执行helper(0);
date[0] = function(){console.log("我的索引位置是:" + index)}
....
....
....
x.执行到date[0]();初始化date[0]环境
1. outer reference = helper environment
2. 初始化环境记录
无
y.执行date[0]()
解析index,即其外部环境helper environment中的index = 0
****************************************************
for循环中的每一次循环都会创建不同的helper环境,其中保存着不同的index值(可以理解为i的副本)
实际上,date[i]获得的匿名函数是一个闭包,其中引用着其外部环境helper环境中的index
****************************************************