作用域
- 前面的文章讲解了预编译的过程。就为作用域做了铺垫
- js中的作用域 全局的GO, 函数的作用域AO。ES6 中的块级作用域。
- 函数也是一中对象,引用类型。fun.name fun.length fun.prototype
- 对象 -> 有些属性是我们无法访问的,JS引擎内部固有的隐式属性
- [[scope]]:
- 函数创建时,生成的一个js内部隐式属性;
- 函数存储作用域链的容器。AO:函数执行期上下文;GO:全局执行期上下文。
- 函数执行完成后,AO是要销毁的。在次执行Fun时会重新生成AO
function a() {
function b() {
var b = 2;
}
var a = 1;
b();
}
var c = 3
a();
/*
执行说明:
当a函数在定义时:
模块一:系统生成了[[scope]]属性,[[scope]]保存的是该函数的作用域链。
[[scope]] -> Scope Chain 作用域链
模块二: 该作用域链的第0位保存的是GO全局执行期上下文。
GO 里存储全局下的所有对象,其中包含函数a和全局变量c
Scope Chain 作用域链
0 -> GO 全局执行上下文
模块三:GO的内容:this -> window;
window -> object
document -> object
a -> function
c -> 3
*/
函数a | “” |
---|---|
[[scope]] | Scope Chain 作用域链 |
Scope Chain
Scope Chain作用域链 | “” |
---|---|
0 | GO |
GO 全局执行上下文
GO全局执行上下文 | “” |
---|---|
this | window |
window | object |
document | object |
a | function |
c | 3 |
/*
当a函数被执行时(前一刻)
作用域链的顶端(第0位)存储a函数生成的函数执行期上下文AO,同时第一位存储的是GO
查找变量的顺序是从a函数的作用域链中从顶端开始一次向下查找
*/
函数a | “” |
---|---|
[[scope]] | Scope Chain 作用域链 |
Scope Chain
Scope Chain作用域链 | “” |
---|---|
0 | 函数a的AO |
1 | GO |
a的AO
函数a的AO函数执行期上下文 | “” |
---|---|
this | window |
arguments | [] |
a | 1 |
b | function |
GO 全局执行上下文
GO全局执行上下文 | “” |
---|---|
this | window |
window | object |
document | object |
a | function |
c | 3 |
/*
当b函数被定义时,
是在a函数环境下,所以b函数这时的作用域链就是a函数被执行期的作用域链。效果同上
*/
/*
当b函数被执行时(前一刻)
生成函数b的[[scope]],存储函数b的作用域链,顶端第0位存储b函数的AO,a函数的AO和全局的GO依次向下排列
*/
函数b | “” |
---|---|
[[scope]] | Scope Chain 作用域链 |
Scope Chain
Scope Chain作用域链 | “” |
---|---|
0 | 函数b的AO |
1 | 函数a的AO |
2 | GO |
b的AO
函数b的AO函数执行期上下文 | “” |
---|---|
this | window |
arguments | [] |
b | 2 |
a的AO
函数a的AO函数执行期上下文 | “” |
---|---|
this | window |
arguments | [] |
a | 1 |
b | function |
GO 全局执行上下文
GO全局执行上下文 | “” |
---|---|
this | window |
window | object |
document | object |
a | function |
c | 3 |
/*
当b函数执行结束后,b函数的AO被销毁,回归被定义时的状态
*/
/*
当a函数被执行结束时,a函数的AO被销毁的同时,b函数的[[scope]]也将不存在。a函数回归到被定义时的状态。
*/