let 和 const 命令
# 核心内容整理:let 和 const 命令
# let 命令
基本用法:
let
用于声明变量,其作用域为块级作用域,即只在声明的代码块内有效。- 与
var
相比,let
声明的变量不存在变量提升现象,必须在声明后使用。
{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1
for 循环计数器:
- 使用
let
声明的变量仅在for
循环体内有效。
for (let i = 0; i < 10; i++) {} console.log(i); // ReferenceError: i is not defined
- 使用
变量提升和暂时性死区:
let
声明的变量在声明之前不可访问,存在“暂时性死区”(TDZ)。
var tmp = 123; if (true) { tmp = 'abc'; // ReferenceError let tmp; }
不允许重复声明:
- 在同一作用域内,不能重复声明同一个变量。
function func() { let a = 10; var a = 1; // 报错 }
块级作用域:
let
为 JavaScript 新增了块级作用域,解决了 ES5 中全局变量泄露的问题。
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5 }
块级作用域与函数声明:
- ES6 允许在块级作用域内声明函数,但浏览器的实现可能存在差异。
function f() { console.log('I am outside!'); } (function () { if (false) { function f() { console.log('I am inside!'); } } f(); }()); // 可能报错
# const 命令
基本用法:
const
用于声明只读常量,一旦声明,其值不能改变。- 必须在声明时立即初始化。
const PI = 3.1415; PI = 3; // TypeError: Assignment to constant variable.
作用域:
const
的作用域与let
相同,只在声明所在的块级作用域内有效。
if (true) { const MAX = 5; } MAX // Uncaught ReferenceError: MAX is not defined
本质:
const
保证的是变量指向的内存地址不变,而非变量的值不变。对于对象和数组,可以修改其属性或元素。
const foo = {}; foo.prop = 123; // 可执行 foo = {}; // TypeError: "foo" is read-only
冻结对象:
- 使用
Object.freeze
可以冻结对象,防止修改其属性。
const foo = Object.freeze({}); foo.prop = 123; // 严格模式下会报错
- 使用
# ES6 声明变量的六种方法
- ES6 引入了
let
和const
,加上var
、函数声明、import
和class
,共有六种声明变量的方法。
# 顶层对象的属性
- ES5 中顶层对象的属性与全局变量等价,但 ES6 规定
let
、const
、class
声明的全局变量不属于顶层对象的属性。
# globalThis 对象
- ES2020 引入
globalThis
作为顶层对象的统一访问方式,适用于所有环境。
通过这些核心内容,可以更好地理解 ES6 中 let
和 const
的使用及其对 JavaScript 语言的影响。
上次更新: 2024/09/03, 03:15:57