在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 defined
const 和 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
用于声明可变的变量。