JavaScript深入浅出-闭包
例子
function outer(){
var localVal=30;
return localVal;
}
outer()//30
---
function outer(){
var localVal=30;
return function(){
return localVal;
}
}
var func=outer();
func();//30;
---
for(var i=0;i<4;i++){
setTimeout(function(){
alert(i)// all are 4!
},500)
}
---
for(var i=0;i<4;i++){
(function(i){
setTimeout(function(){
alert(i)//随机1-4出现 因为异步的关系,但是并不是4
},1000)
})(i)
}
第一种当函数执行完毕后,垃圾回收机制会把局部变量给回收第二种就是闭包了,当函数执行完毕后返回一个函数,因为作用域链的关系window=>outer=>function()[匿名函数];
实例分析
如图.
全局初始化阶段
AO(global){
add:<ref to func 'add'>,
f:undefined,
}
全局执行阶段
AO(global)[f]= run func add
add初始化阶段
AO(add){
i:undefined,
}
add执行阶段
AO(add)[i]=0;
AO(add) return go to global and set global f
全局执行阶段-1
AO(global)[f]=anonymous function
AO(global) f() run func 'f'
f初始化阶段
AO(f){
outer:add
}
f执行阶段
AO(f) alert(i++) // find to outer ... in func add
在outer找到i