❝你从互联网上学东西、掌握新的技能,或者互联网帮助你实现自我,那么互联网就是你的工具;如果你只是在互联网上玩乐,花了自己的时间和金钱,却只得到了精神的满足,那你是互联网的工具。在免费的江湖里,你就是产品 --《向上生长》 ❞
简明扼要
- 作用域是「静态」的
- 作用域通过「词法环境」实现的
- 词法环境 = 环境记录 OuterEnv
- 变量的作用域链由词法环境中
OuterEnv
串联 - 在浏览器环境下,
globalThis
不直接指向全局对象 WindowProxy
是一个将所有访问转发到当前窗口的对象- 全局环境记录使用
对象环境记录
和声明环境记录
来管理变量 - 通过
const
,let
和class
创建的变量被绑定到声明环境记录中 - 通过
var
和函数声明的变量被绑定到对象环境记录中 - 声明环境变量中变量优先访问
- 使用ECMAScript和宿主环境的内置全局变量初始化全局对象
文章概要
- Scope(作用域)
- Lexical Environments (词法环境)
- 全局对象(global object)
- 浏览器环境下的
globalThis
- 全局环境(global envrionment)
- Script 作用域 和Module 作用域
- 生成变量: 声明环境记录 vs 对象环境记录
- 访问变量
- 全局ECMAScript变量和全局宿主变量
- 一图胜前言
1. Scope(作用域)
我们平时常说的变量的作用域(scope
),它全名应该叫「词法作用域」(lexical scope
)。它是程序中可以访问变量的区域,即作用域控制着变量和函数的可见性和生命周期。
我们在前期的文章中,描述了,V8执行JS代码核心流程 1. 先编译 2. 后执行。在这个编译的过程就是「静态」的。所以我们可以这么说,作用域是「不随代码的运行而改变」的变量查找机制。
❝JS的作用域是静态的 ❞
同时,作用域还可以被嵌套。
代码语言:javascript复制function func() { // (A)
const v1 = 1;
if (true) { // (B)
const v2 = 2;
}
}
如上所示: 在B行的if
语句内嵌在A行的func()
函数作用域。
我们把内部作用域外面的作用域称为:outer
作用域。例如:func
作用域就是if
作用域的 outer
作用域。
2. Lexical Environments (词法环境)
在ecma262(自备