1、作用域概念
所谓的作用域就是[[scope]],其中存放了运行期上下文的集合。根据预编译的讲解得知,运行期上下文就是指AO,GO对象。
作用域链:[[scope]]中存储的是运行期上下文的集合,而这些集合均以链式链接,因此将这种连接称为作用域链。
运行期上下文:当函数在执行时,会创建一个运行期上下文的内部对象。一个执行期上下文定义了一个函数的执行环境,并且函数每次执行所产生的运行期上下文都是独一无二的,即函数多次运行则会产生多个运行期上下文的对象。当函数执行完毕后,它所产生的运行期上下文会被销毁。
变量查找:从作用域的最顶端依次向下查找。
2、案例
2.1 案例一
function a(){
function b(){
var bb = 234;
a = 0;
}
var a = 123;
b();
console.log();
}
var glob = 100;
a();
产生执行期上下文:
(1) 当a函数定义时,会产生一个运行期上下文GO:
(2) 当a函数执行时,在已有GO的情况下,会产生一个运行期上下文AO:
(3) 当a函数执行时,a函数中存在函数b,因此a函数执行时,会存在b函数的定义,由于b函数属于a函数内部,并且处于a函数执行时,因此b函数所产生的执行期上下文是a函数执行时所产生的上下文
(4) 当b函数执行时,会在原有的上下文的基础上再次创建一个执行期上下文。
注意:改变函数b中变量:aa = 0;则在函数a中再次访问aa,依然会打印aa.
说明b函数在定义或在执行时所存在的GO对象以及其中的一个AO对象均是函数a所给的,因此,当函数b修改了AO对象中的某个变量值,a函数中的执行期也会相应的发生改变。
消除执行期上下文:
当函数执行完毕后,执行期上下文均会被干掉。
2.2 案例二
function a(){
function b(){
function c(){}
c();
}
b()
}
函数讲解:
(1) a defined a.[[scope]] ---> 0:GO
a doing a.[[scope]] ---> 0:AO【属于函数a】
1:GO
b defined b.[[scope]] ---> 0:AO【属于函数a】
1:GO
b doing b.[[scope]] ---> 0:AO【属于函数b】
1:AO【属于函数a】
2:GO
c defined c.[[scope]] ---> 0:AO【属于函数b】
1:AO【属于函数a】
2:GO
c doing c.[[scope]] ---> 0:AO【属于函数c】
1:AO【属于函数b】
2:AO【属于函数a】
3:GO
2.3 案例二
function a(){
function b(){
var bbb = 2324;
console.log(aaa);
}
var aaa = 3;
return b;
}
var glob = 100;
var demo = a();
demo();
(1) 首先定义a函数时,会产生GO对象
GO: this window
window object
document object
a function
glob 100
demo function
(2) 执行函数a,
AO:
this window
arguments []
b function
aaa 3
GO:
this window
window object
document object
a function
glob 100
demo function
(3) 定义函数b
AO:
this window
arguments []
bbb 2324
AO:
this window
arguments []
b function
aaa 3
GO:
this window
window object
document object
a function
glob 100
demo function
由于函数a中没有执行函数b,因此b处于等待执行的过程中,而函数a执行的最后一句为return b,该语句执行完成后,代表a函数执行完毕,则会销毁执行期上下文对象,因此函数a所有的对象全部会被销毁,而b的对象来自于a,按正常情况应该会被销毁。但是在函数的最后,将b返回给demo,因此b的作用域链不会被取消,依然保持存在。
(4) demo = a();//结果为b的作用域链被保存
demo的执行期上下文对象为:
AO:
this window
arguments []
b function
aaa 3
GO:
this window
window object
document object
a function
glob 100
demo function
(5) demo();执行过程
AO:
this window
arguments []
bbb 2324
AO:
this window
arguments []
b function
aaa 3
GO:
this window
window object
document object
a function
glob 100
demo function
打印结果为:3