在JavaScript的ES6(ECMAScript 2015)版本中,引入了let
和const
两个新的变量声明关键字,它们在作用域和变量声明的特性和行为上与传统的var
关键字有所区别。
let:
- 块级作用域:
let
声明的变量具有块级作用域,这意味着变量在其所在的代码块(大括号{}
内部)有效,离开该块后变量将不可见。这一点与var
不同,var
声明的变量在函数作用域内有效,而不是严格意义上的块级作用域。 - 暂时性死区(TDZ, Temporal Dead Zone):在
let
声明变量之前,变量所在的作用域内不能访问该变量,即变量声明会被“冻结”在该位置,直至声明语句执行完毕。 - 防止变量提升:与
var
不同,let
声明的变量不会被提升至其作用域的顶部,只有在let
声明被执行后才能访问该变量。
- 块级作用域:
const:
- 常量声明:
const
用于声明常量,一旦声明其值就不可以再被改变,但请注意,对于复杂类型的值(如对象或数组),const
保证的是对引用的不可变性,而非所引用的对象或数组内容本身不可变。 - 块级作用域:如同
let
,const
声明的变量同样具有块级作用域。 - 也具有暂时性死区:与
let
相似,const
声明的变量在声明之前同样处于暂时性死区,不能被访问。
- 常量声明:
与var关键字的主要区别:
- 作用域:
var
声明的变量作用域可以是函数作用域,也可以是全局作用域;而let
和const
声明的变量具有更精确的作用域——块级作用域。 - 变量提升:
var
声明的变量会发生变量提升,即变量可以在声明之前就被访问到(值为undefined
);而let
和const
声明的变量不会提升到作用域顶部。 - 可变性:
var
声明的变量总是可变的;const
声明的变量是不可变的(值不可更改),而let
声明的变量在声明后可以重新赋值。
通过引入let
和const
,JavaScript增加了对变量作用域的控制力,同时也增强了代码的可读性和减少了意外的副作用。这让开发者能够写出更具预见性和更不容易出错的代码。