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