1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| function (){ var localVal=30; return localVal; } outer() --- function (){ var localVal=30; return function(){ return localVal; } } var func=outer(); func(); --- for(var i=0;i<4;i++){ setTimeout(function(){ alert(i) },500) } --- for(var i=0;i<4;i++){ (function(i){ setTimeout(function(){ alert(i) },1000) })(i) }
|
第一种当函数执行完毕后,垃圾回收机制会把局部变量给回收
第二种就是闭包了,当函数执行完毕后返回一个函数,因为作用域链的关系
window=>outer=>function()[匿名函数];
实例分析
如图.
全局初始化阶段
1 3 4
| AO(global){ add:<ref to func 'add'>, f:undefined, }
|
全局执行阶段
1
| AO(global)[f]= run func add
|
add初始化阶段
1 2 3
| AO(add){ i:undefined, }
|
add执行阶段
1 2
| AO(add)[i]=0; AO(add) return go to global and set global f
|
全局执行阶段-1
1 2
| AO(global)[f]=anonymous function AO(global) f() run func 'f'
|
f初始化阶段
f执行阶段
1
| AO(f) alert(i++) // find to outer ... in func add
|
在outer找到i