ES6(ECMAScript 2015)引入了let
和const
这两个新的关键字来声明变量,与之前的var
关键字相比,它们提供了更严格的作用域规则和块级作用域。以下是let
、const
与var
之间的主要区别:
文末有我帮助400多位同学成功领取到前端offer的场景题哦
- 块级作用域:
var
声明的变量具有函数作用域或全局作用域,不具备块级作用域(即一对花括号{}
内部)。let
和const
声明的变量具有块级作用域,这意味着它们只在其声明的代码块内可用。
- 变量提升(Hoisting):
- 使用
var
声明的变量存在变量提升(hoisting)现象,即变量声明会被提升到其所在作用域的顶部。但变量的赋值仍然保留在原来的位置。 let
和const
声明的变量不存在变量提升,这意味着在声明之前访问这些变量会抛出ReferenceError
。
- 使用
- 暂时性死区(Temporal Dead Zone, TDZ):
- 在
let
或const
声明的变量被初始化之前的区域被称为暂时性死区。尝试在暂时性死区内访问这些变量会抛出ReferenceError
。
- 在
- 重新声明:
- 使用
var
可以在同一作用域内多次声明同一个变量,而不会报错,但这样做会导致混淆和不可预期的结果。 let
和const
不允许在同一作用域内重复声明同一个变量,否则会抛出SyntaxError
。
- 使用
- 常量声明:
var
和let
都可以声明可变的变量。const
用于声明一个常量,其值在初始化后不能被重新赋值。但需要注意的是,const
声明的变量指向的内存地址是不可变的,但如果该变量引用的是一个对象或数组,对象或数组内部的值是可以改变的。
- 全局作用域中的声明:
- 在全局作用域中使用
var
声明的变量会成为全局对象的属性(在浏览器中是window
对象)。 - 使用
let
和const
在全局作用域中声明的变量不会成为全局对象的属性,它们只存在于全局作用域中。
- 在全局作用域中使用
通过引入let
和const
,ES6为JavaScript提供了更清晰的作用域规则和更安全的变量声明方式,有助于减少因变量提升和全局变量污染导致的错误。