概述
JavaScript 的可执行代码,具有执行上下文,而每个上下文包括以下 3 个属性:
变量对象(variable object, 简称 VO)
作用域链(scope chain)
this
变量对象提供了当前环境所需的变量和函数
作用域链用于保证 JS 中变量和函数有序地访问
this 为函数提供了执行者对象
一个上下文的执行周期可以用下图示意:
本文就来介绍执行上下文中的变量对象。
那什么是变量对象呢?先看定义:
变量对象是与执行上下文相关的数据作用域,用于存储执行上下文中的变量和函数声明。
不同的执行上下文,变量对象会有一些差别。接下来就分别针对不同的上下文讨论其区别。
一、全局上下文
全局对象(Global object) 是在进入任何执行上下文之前就已经创建了的对象;
这个对象只存在一份,它的属性在程序中任何地方都可以访问,全局对象的生命周期终止于程序退出那一刻。
在全局代码的上下文执行环境中,变量对象就是全局对象,在浏览器中,就是 window 对象。
此时,我们可以用 this 和 self 来访问到全局对象,也就是它本身
console.log(this) // window
console.log(self) // window
其次,全局对象初始创建阶段将 Math、String、Date、parseInt 等函数作为自身方法,还会把全局变量作为自己的属性。
用伪代码表示就是:
global = {
Math: <...>
Date: <...>
window: global // 引用自身
} |