// ✅ 声明时必须初始化
const name = 'John';
const age = 25;
const person = { name: 'John' };
2.2 错误的声明方式
js复制代码
// ❌ 不能只声明不赋值
const name; // SyntaxError: Missing initializer in const declaration
// ❌ 不能先声明后赋值
const age;
age = 25; // SyntaxError: Missing initializer in const declaration
3. 不允许重复定义
3.1 同一作用域重复声明
js复制代码
// ❌ 同一作用域不能重复声明
const name = 'John';
const name = 'Jane'; // SyntaxError: Identifier 'name' has already been declared
// ❌ 与其他声明方式混用也不行
const age = 25;
var age = 26; // SyntaxError: Identifier 'age' has already been declared
let age = 26; // SyntaxError: Identifier 'age' has already been declared
3.2 不同作用域的声明
js复制代码
// ✅ 不同作用域可以声明同名常量
const x = 1;
if (true) {
const x = 2; // 正常工作
console.log(x); // 2
}
console.log(x); // 1
function example() {
const x = 3; // 正常工作
console.log(x); // 3
}
4. 不具有变量提升
4.1 变量提升问题
js复制代码
// ❌ 在声明前访问会报错
console.log(name); // ReferenceError: Cannot access 'name' before initialization
const name = 'John';
// ❌ 在函数中也是一样
function example() {
console.log(age); // ReferenceError: Cannot access 'age' before initialization
const age = 25;
}
5. 暂时性死区(TDZ)
5.1 基本概念
js复制代码
// 从作用域开始到变量声明前的区域称为暂时性死区
{
console.log(name); // ReferenceError: Cannot access 'name' before initialization
const name = 'John';
}
5.2 复杂场景中的 TDZ
js复制代码
// 函数参数中的 TDZ
function example(x = y, y = 1) {
return [x, y];
}
example(); // ReferenceError: Cannot access 'y' before initialization
// 条件语句中的 TDZ
if (true) {
console.log(value); // ReferenceError
const value = 123;
}
6. 不与顶层对象挂钩
6.1 与全局对象的关系
js复制代码
// 浏览器环境
const name = 'John';
console.log(window.name); // undefined
// Node.js 环境
const age = 25;
console.log(global.age); // undefined