通过 ECMAScript 标准视角看 var、let 和 const 的区别

💡 原文英文,约3100词,阅读约需11分钟。
📝

内容提要

本文解释了var、let和const之间的区别,重点在于作用域、执行上下文的创建阶段和变量初始化。let和const关键字创建的变量在创建阶段被赋予未初始化的值,而var变量被赋予undefined值。let和const变量的作用域是词法环境,而var变量的作用域是变量环境。let和var变量可以有相同的名称,但const变量不能。

🔎

延伸解读

从标准理解变量行为

文章强调,通过ECMAScript标准来理解var、let和const的区别,比仅依赖“提升”“暂时性死区”等非标准术语更准确。标准中明确定义了执行上下文、词法环境和变量环境等抽象结构,这些是变量行为差异的根本原因。对于希望深入掌握JavaScript的开发者,阅读标准能提供更可靠的解释。

执行上下文两阶段的关键作用

执行上下文的创建阶段和执行阶段是理解变量初始化的核心。在创建阶段,let和const变量被标记为未初始化,而var变量被赋值为undefined。这解释了为什么var变量在声明前访问返回undefined,而let/const变量在声明前访问会抛出ReferenceError。这种差异直接影响代码的编写和调试。

作用域与重复声明的实际影响

let和const变量作用域为块级,var变量作用域为函数或全局。这导致在块内用let声明的变量在块外不可访问,而var声明的变量会泄漏到外层。此外,同一作用域内var允许重复声明,let和const则不允许,重复声明会引发语法错误。这些规则有助于避免变量污染和意外覆盖。

const的不可变性与初始化要求

const变量必须在声明时初始化,否则会报语法错误。同时,const变量不能被重新赋值,尝试修改会抛出TypeError。这与let不同,let变量可以没有初始化器,默认值为undefined,且可以重新赋值。理解这些限制有助于在需要常量时正确选择const。

❓

Q&A

var、let和const的主要区别是什么?

var、let和const的主要区别在于作用域、执行上下文的创建阶段和变量初始化。let和const的作用域是词法环境,而var的作用域是变量环境。

let和const在创建阶段的变量初始化有什么不同?

let和const在创建阶段被赋予未初始化的值,而var变量在创建阶段被赋予undefined值。

为什么let和const变量在创建阶段不可访问?

let和const变量在创建阶段被赋予未初始化的值,直到词法绑定被评估之前不可访问,这种状态称为临时死区(TDZ)。

const变量有什么特别的限制?

const变量必须在声明时初始化,且不能被重新赋值。

var变量可以重复声明吗?

是的,在同一作用域内,var变量可以重复声明,而let和const变量不能。

执行上下文的创建阶段和执行阶段有什么区别?

执行上下文的创建阶段用于初始化变量,而执行阶段则是变量被赋值和执行代码的阶段。

🏷️

标签

➡️

继续阅读