在JavaScript中,const 关键字用于声明一个只读的常量,其值在初始化后不能被重新赋值。关于变量提升(Hoisting),它是JavaScript中一个重要的概念,指的是无论变量或函数声明在何处,它们都会被“提升”到其所在作用域的最顶部。但是,这个规则不完全适用于const和let声明的变量。
变量提升(Hoisting)的传统理解
在ES6之前,JavaScript只有var关键字用于声明变量。var声明的变量确实会被提升,这意味着变量可以在声明之前被访问(尽管此时它的值是undefined)。
console.log(x); // 输出:undefined
var x = 5;
'
运行运行
let 和 const 的行为
ES6引入了let和const作为新的变量声明方式,它们的设计初衷之一就是为了解决var带来的作用域和变量提升方面的问题。与var不同,let和const声明的变量不会被提升到其作用域的顶部,并且它们遵循所谓的“暂时性死区”(Temporal Dead Zone, TDZ)规则。
在“暂时性死区”内,任何对let或const变量的访问都会抛出一个ReferenceError错误,直到变量被实际声明为止。
console.log(y); // 抛出 ReferenceError: y is not defined
let y = 10;
console.log(z); // 抛出 ReferenceError: z is not defined
const z = 20;
结论
因此,const(以及let)声明的变量没有变量提升。这意味着你必须在声明它们之后才能访问它们,否则会导致ReferenceError错误。这一行为使得let和const在声明局部变量时更加安全和可预测。