必备知识:
- 基础数据类型与引用数据类型
- 内存空间
- 垃圾回收机制
- 执行上下文
- 变量对象与活动对象
作用域
和执行上下文的区别:
JavaScript代码的整个执行过程,分为两个阶段,
- 编译阶段:由编译器完成,将代码翻译成可执行代码,这个阶段作用域规则会确定。
- 执行阶段:由引擎完成,主要任务是执行可执行代码,执行上下文在这个阶段创建。
作用域链
结合执行上下文的生命周期,得出下图:
作用域链,是由当前环境与上层环境的一系列变量对象组成,它保证对执行环境有权访问的所有变量和函数的有序访问。
var a = 20;
function test() {
var b = a + 10;
function innerTest() {
var c = 10;
return b + c;
}
return innerTest();
}
test();
右边红框里的就是innerTest的作用域链,
- global:this.window
- test: b:30
- innerTest: innerTest()
有人误解当前作用域和上层作用域之间是包含关系,其实并不是,而是以当前作用域为起点,全局作用域为重点的单向通道。如图:
注意,因为变量对象在执行上下文进入执行阶段时,就变成了活动对象,这一点在上一篇文章中已经讲过,因此图中使用了AO来表示。Active Object