JavaScript深入浅出-闭包

      
      
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
大专栏   JavaScript深入浅出-闭包ine">2
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

猜你喜欢

转载自www.cnblogs.com/lijianming180/p/12361039.html