在ES6及之后的版本中,引入了 let 和 const 关键字,它们与 var 关键字在变量声明和作用域方面有一些重要的区别。
1. let 和 var 的区别:
变量作用域:
- var: 使用
var声明的变量是函数作用域(function-scoped),即它们只在声明它们的函数内部可见。
function exampleVar() { if (true) { var x = 10; } console.log(x); // 输出 10 }- let: 使用
let声明的变量是块级作用域(block-scoped),它们在包含它们的块(如{}、for循环等)内可见。
function exampleLet() { if (true) { let y = 20; } console.log(y); // 报错,y is not defined }- var: 使用
变量提升:
- var: 使用
var声明的变量存在变量提升,即在代码执行前会被提升到函数或全局作用域的顶部,但是初始化的赋值不会提升。
console.log(a); // 输出 undefined var a = 5;- let: 使用
let声明的变量也存在变量提升,但在初始化之前不可访问,会导致暂时性死区(Temporal Dead Zone)。
console.log(b); // 报错,Cannot access 'b' before initialization let b = 10;- var: 使用
2. const:
常量声明:
const用于声明常量,其值在声明后不能被重新赋值。
const PI = 3.14159; PI = 3; // 报错,Assignment to constant variable.块级作用域:
const也具有块级作用域,类似于let。
if (true) { const MAX_VALUE = 100; } console.log(MAX_VALUE); // 报错,MAX_VALUE is not definedconst 和 let 的共同点:
const和let都解决了var在作用域和变量提升方面的问题,而且都是块级作用域。
if (true) { let x = 1; const y = 2; } console.log(x); // 报错,x is not defined console.log(y); // 报错,y is not defined
总体来说,推荐使用 let 和 const,而不再使用 var,因为它们提供了更好的作用域控制和变量声明方式。 const 用于声明不会被重新赋值的常量,而 let 用于声明可变的变量。