现在可以在 JavaScript 中使用两种新的方式来声明变量:let 和 const。
到目前为止,在 JavaScript 中声明变量的唯一方式是使用关键字 var。为了理解为何添加了 let 和 const,我们先看一个示例,了解使用 var 会带来怎样的麻烦。
请看看下面的代码。
你认为运行 getClothing(false) 后的输出是什么?
function getClothing(isCold) {
if (isCold) {
var freezing = 'Grab a jacket!';
} else {
var hot = 'It's a shorts kind of day.';
console.log(freezing);
}
}
结果时undefined,为什么呢?那是因为。。。
提升
提升是浏览器解析 JavaScript 的结果。本质上,在执行任何 JavaScript 代码之前,所有变量都会被“提升”,也就是提升到函数作用域的顶部。因此在运行时,getClothing() 函数实际上看起来如下所示…
function getClothing(isCold) {
var =freezing,hot;
if (isCold) {
freezing = 'Grab a jacket!';
} else {
hot = 'It's a shorts kind of day.';
console.log(freezing);
}
}
在执行该函数之前,所有变量都会被提升到该函数作用域的顶部。我们该怎么办?
let 和 const
使用 let 和 const 声明的变量解决了这种提升问题,因为它们的作用域是到块,而不是函数。之前,当你使用 var 时,变量要么为全局作用域,要么为本地作用域,也就是整个函数作用域。
如果在代码块(用花括号 { } 表示)中使用 let 或 const 声明变量,那么该变量会陷入暂时性死区,直到该变量的声明被处理。这种行为会阻止变量被访问,除非它们被声明了。
function getClothing(isCold) {
if (isCold) {
let freezing = 'Grab a jacket!';
} else {
let hot = 'It's a shorts kind of day.';
console.log(freezing);
}
}
//使用 let 和 const 声明的变量仅在它们所声明的块中可用。
你认为运行 getClothing(false) 后的输出是什么?
function getClothing(isCold) {
if (isCold) {
const freezing = 'Grab a jacket!';
} else {
const hot = 'It's a shorts kind of day.';
console.log(freezing);
}
}
答案是freezing is not defined
关于使用 let 和 const 的规则
let 和 const 还有一些其他有趣特性。
使用 let 声明的变量可以重新赋值,但是不能在同一作用域内重新声明。
使用 const 声明的变量必须赋初始值,但是不能在同一作用域内重新声明,也无法重新赋值。
你认为运行以下代码后的输出是什么?
let instructor = 'James';
instructor = 'Richard';
console.log(instructor);
//Richard
使用案例
最大的问题是何时应该使用 let 和 const?一般法则如下:
- 当你打算为变量重新赋值时,使用 let,以及
- 当你不打算为变量重新赋值时,使用 const。
因为 const 是声明变量最严格的方式,我们建议始终使用 const 声明变量,因为这样代码更容易读懂,你知道标识符在程序的整个生命周期内都不会改变。如果你发现你需要更新变量或更改变量,则回去将其从 const 切换成 let。
很简单吧?但是 var 呢?
var 该怎么办?
还有必要使用 var 吗?没有了。
在某些情况下有必要使用 var,例如如果你想全局定义变量,但是这种做法通常都不合理,应该避免。从现在开始,建议放弃使用 var,改为使用 let 和 const。