JavaScript var、let 和 const
我讨厌介绍,但我们必须有一个🤷
2015 年之前,JavaScript 开发人员习惯使用var
作为关键字来声明变量,生活很轻松,但并不平静😅
通过使用var
声明变量,开发人员必须在许多领域进行斗争……
重新声明🤦♀️
信不信由你,var
你可以多次使用相同的变量名而不会遇到任何错误,但你必须为意外的结果做好准备😬。
想象一下:
function sayHi() {
var name = "Our New User"
var isLoggedIn = true
if (isLoggedIn) {
var name = "Sarah"
}
console.log("Hi" + name) // Hi Sarah
}
现在你想到的第一件事是,那又怎样?!
我重新定义了这个变量,这有什么问题?🤨这根本不是问题,只要你知道这正是你想要做的,而不仅仅是你忘记了这个变量之前已经声明过🧐。
重新声明的真正问题出现在大型应用程序中,一旦你忘记了以前使用过相同的变量名。
免责声明✋:如果您有可靠的记忆力,可以帮助您记住在特定范围内声明的所有变量,这将不是问题。
范围😵
上面这一行以单词SCOPE结尾,在深入研究之前,让我们首先了解一下什么是范围,将 scop 视为一个可以访问某些函数和变量的盒子。
使用关键字声明的变量的可能性var
是无限的,除非它们是在函数内声明的。
这意味着如果变量不在函数内部,它将可在整个应用程序中访问。
现在尝试将这一点与之前重新声明联系起来,
现在开发人员必须记住他们在全局/函数范围内声明的所有变量,否则他们会发现自己陷入了意想不到的结果。
想象一下以下情况……
function sayHi() {
var name = "Our New User"
var isLoggedIn = true
if (isLoggedIn) {
var name = "Sarah"
console.log("Hi" + name) // Sarah
}
console.log("Hi" + name) // Sarah
}
if 块内的日志是有意义的,因为我们正在记录此块内定义的变量,但 if 块外的日志才是突出问题的日志,它应该打印“我们的新用户”在 if 块外声明的变量的值,但这里发生的事情是name
if 块内声明的变量完全取代了 if 块外声明的变量,这里我们必须提到提升。
提升😧
提升是将变量和函数声明提升到其范围顶部的过程。
使用关键字声明的变量var
被提升到全局/函数范围的顶部,并使用未定义的值初始化。
把这一点与上一点联系起来,
function sayHi() {
var name = "Our New User"
var isLoggedIn = true
if (isLoggedIn) {
var name = "Sarah"
console.log("Hi" + name) // Sarah
}
console.log("Hi" + name) // Sarah
}
现在我们可以找出这里发生了什么,在 if 块中声明的新变量被提升到函数的顶部,当然也替换了原来的变量,这就解释了为什么两个控制台日志打印相同的结果。
现在,我们已经了解了 js 开发人员花费很长时间解决的问题,现在让我们继续看看 ES2015 是如何拯救我们的 😉。
关于重新声明,使用let
或声明的变量const
不能在同一范围内重新声明。
提到范围,let
和const
都是块范围的,代码块是 {} 内的任何一组代码let
,这意味着如果在 {} 内使用或声明的变量,则const
该变量将无法在这些 {} 之外访问,尽管它们被提升到其范围的顶部,即 {}。
现在让我们检查一下 sayHi 函数...
function sayHi() {
let name = "Our New User"
var isLoggedIn = true // out of our scope
if (isLoggedIn) {
let name = "Sarah"
console.log("Hi" + name) // Sarah
}
console.log("Hi" + name) // Our New User
}
现在它可以按预期工作,在 if 块中声明的新变量保留在 if 块内,并且不会影响 if 块外的变量
但现在的问题是,该用哪一个let
呢const
🤔?!
答案是,无论你想要什么😇,只要记住用 声明的变量let
可以更新,而用 创建的变量则const
不能更新。
希望以上内容对您有所帮助,感谢您的阅读。如果您有任何问题或想让我写一些主题,我很乐意为您提供帮助❤️
文章来源:https://dev.to/smileycode/var-let-and-const-in-js-597n