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();//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()[匿名函数];
实例分析
如图.
全局初始化阶段
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