
在JavaScript中const 的重复声明规则与 let 类似,但更为严格, 默认情况下不允许重复声明 。唯一的「例外情况」同样是在 不同作用域 中的变量遮蔽。下面详细解释:
一、const的核心规则:同一作用域内禁止重复声明
根据ES6规范 const 声明的常量具有「 不允许同一作用域内重复声明 」的特性,具体表现为:
同一代码块内 :不能用 const 重复声明已存在的变量(无论之前是用 const,let 还是 var 声明的)。
函数作用域内 :不能用 const 重复声明函数作用域内已存在的变量。
违反此规则会直接抛出 SyntaxError 错误 (语法错误,在代码解析阶段就会报错,不会执行)。
示例1:同一代码块内重复声明
{
const a = 10;
const a = 20; // 语法错误:SyntaxError: Identifier 'a' has already been declared
}示例2:与let/var在同一作用域重复声明
{
let b = 10;
const b = 20; // 语法错误:SyntaxError: Identifier 'b' has already been declared
}
{
var c = 10;
const c = 20; // 语法错误:SyntaxError: Identifier 'c' has already been declared
}二、const允许「重复声明」的唯一情况:不同作用域的变量遮蔽
const 常量 只有在不同作用域中 才可以声明同名变量,这种情况同样被称为「 变量遮蔽 」(Variable Shadowing)。此时,内层作用域的常量会「遮蔽」外层作用域的同名常量,但它们本质上是两个独立的常量。
示例3:不同作用域的同名const常量
// 外层作用域声明const常量
const x = 100;
function test() {
// 内层作用域可以声明同名的const常量(这不是重复声明,而是创建了新常量)
const x = 200;
console.log(x); // 输出:200(访问的是内层常量)
}
test();
console.log(x); // 输出:100(访问的是外层常量)示例4:代码块内的变量遮蔽
const y = 300;
if (true) {
const y = 400; // 内层块级作用域的y,遮蔽外层的y
console.log(y); // 输出:400
}
console.log(y); // 输出:300(外层的y不受影响)三、const的额外特性:不可重新赋值与必须初始化
需要注意的是 const 与 let 还有一个关键区别 const 声明的变量 必须在声明时初始化 ,并且 后续不能重新赋值 (但对于引用类型,其内部属性可以修改)。这一特性与重复声明是独立的概念。
示例5:const必须初始化
const z; // 语法错误:SyntaxError: Missing initializer in const declaration
示例6:const不能重新赋值
const PI = 3.14159;
PI = 3.14; // 类型错误:TypeError: Assignment to constant variable.总结
const 常量 只有在不同作用域中 可以声明同名变量(变量遮蔽),而在 同一作用域内永远不允许重复声明 (会直接抛出语法错误)。此外const 还要求声明时必须初始化且后续不能重新赋值,这些特性共同确保了 const 的「常量」语义,比 let 更为严格。