最近ES6发布后,许多资源建议我在JavaScript中使用"const"和"let"代替"var",并且应该停止使用"var"。
我想知道的是,如果在所有方面上"var"没有优势,为什么他们不只是修复"var"甚至将其弃用,而不是让它们并存呢?
最近ES6发布后,许多资源建议我在JavaScript中使用"const"和"let"代替"var",并且应该停止使用"var"。
我想知道的是,如果在所有方面上"var"没有优势,为什么他们不只是修复"var"甚至将其弃用,而不是让它们并存呢?
如果您在函数开头定义它们,使用var
和let
没有实质性的优势,它们的含义基本相同。
您说得对,除非涉及到this,否则没有真正的理由写新代码时使用var
。
然而,互联网上有些页面已经存在几十年了,没有人会重写它们。从语言中删除var
并没有什么实际收益。对于像HTML和JavaScript这样的解释性语言,向后兼容性是绝对必要的。
这也是为什么他们选择不简单地重新定义var
的原因。以下是一个示例代码:
// THIS IS AN EXAMPLE OF BAD CODE. DO NOT COPY AND PASTE THIS.
if (logic) {
var output = "true"
} else {
var output = "false"
}
console.log(output)
var
更改为像let
那样运作,那么由于作用域的差异,console.log
会导致引用错误。var
(这确实会发生),那么该代码的含义将发生变化并且可能会崩溃,对于编写它的开发人员来说可能没有任何警告。 - Shadowvar
的一个好用法的好例子。 - jfriend00var
改成 let
是一个不好的想法,这也是本意所在。 - Shadowfunction makeUniqueId(takenIds) {
do {
var id = Number.parseInt(Math.random() * 10);
} while (takenIds.includes(id))
}
makeUniqueId([1,2,3,4,5,6,7])
do
块内简单地声明了id
变量,并将其“提升”到函数范围。如果我使用let
,那么会导致错误,因为while
块将无法看到来自do
块的变量。当然,我可以在do..while
之前声明let
,但这会创建具有额外代码行的相同函数作用域变量。
另一个例子是当您将代码复制粘贴到devtools控制台中时,每次变量都会被重新声明。
再来一个例子。如果您想将变量声明保持靠近其用法,但仍将它们视为函数全局变量,该怎么办?如果以这种方式使用let
,则在dev工具中会得到相当令人困惑的体验(所有这些Block、Block scopes)。
var
将它们保持在一个“本地”列表中:
每种变量声明方式都有其优缺点,使用var、const和let取决于它们的用例。
var
变量声明在代码执行之前进行处理。 使用 var 声明的 JavaScript 变量的作用域是其当前执行上下文。 在函数外部声明的 JavaScript 变量的作用域是全局的。
let
let语句允许您创建一个变量,其作用域仅限于使用它的块。
const
const语句的值只能被赋值一次,且不能重新赋值。const语句的作用域与let语句类似。
希望你理解。
var
的任何优点。你也可以在函数或全局级别使用 let
,那么除了在块中声明一个 var
但在该块之外使用它这样的不愉快行为之外,还有什么优势呢? - user8897421let
和 const
也是如此。 - Bergi
var
比let
更有用。 - Paulvar
仍然有其用途。 - jhpratt