var
:在 ES5(及之前)中是声明变量的关键字。它有以下特点:var
声明的变量作用域是函数作用域(function scope)。- 可以在同一个作用域内重复声明同名变量,且后面的声明会覆盖前面的声明。
- 变量提升:无论声明在哪里,
var
声明的变量会被提升到函数体的顶部。 - 没有块级作用域:在块级作用域(如
if
、for
、while
等代码块)中声明的变量会被提升到外层函数作用域或全局作用域中。
let
:在 ES6 中引入的块级作用域变量声明关键字。它有以下特点:let
声明的变量作用域是块级作用域(block scope)。- 不允许在同一个作用域内重复声明同名变量。
- 变量不会被提升到作用域的顶部,也不会出现“暂时性死区”(Temporal Dead Zone,TDZ)的问题。
- 在
for
循环中声明的变量属于每个迭代的块级作用域。
const
:也是在 ES6 中引入的声明变量的关键字,用于声明常量。它有以下特点:const
声明的变量作用域也是块级作用域。- 声明时必须同时进行初始化,并且不能再重新赋值,即常量的值是不可变的。
- 对于复合类型的常量(如对象、数组等),其成员或元素仍然可以修改。
总结:
- 使用
var
声明变量时,作用域是函数作用域,并且存在变量提升的问题。 - 使用
let
声明变量时,作用域是块级作用域,不存在变量提升,可以防止重复声明。 - 使用
const
声明常量时,作用域同样是块级作用域,且常量的值是不可变的,但复合类型的常量成员可以修改。
在实际开发中,推荐使用 let
和 const
来声明变量和常量,避免了 var
的一些问题,并且能够更好地控制作用域和变量的可变性。