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初始化阶段
1
2
3
|
AO(
f){
outer:add
}
|
f执行阶段
1
|
AO(f) alert(i++) // find
to outer ...
in
func add
|
在outer找到i