为什么不推荐使用 var?

Why is var not deprecated?

最近在 ES6 发布后,许多消息来源建议我使用 "const" 和 "let" 而不是 "var",并且我应该停止在我的 [=] 中使用 "var" 21=].

我想知道的是,如果 "var" 在所有观点上都没有优于 "let",那么他们为什么不直接修复 var,甚至弃用 "var"让他们并排走?

向后兼容。

你说得对,使用 var over let 没有真正的优势 - 如果你在函数的开头定义它们,它们的含义基本上是相同的。

你是对的,没有真正的理由使用 var 编写新代码(除了 this,如果相关的话)。

虽然 Internet 上有些页面已有数十年历史,但没有人会重写它们。从语言中删除 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 const 和 let 各有优缺点。

var

在代码执行之前处理变量声明。 用 var 声明的 JavaScript 变量的范围是它的当前执行上下文。 在函数外部声明的 JavaScript 变量的范围是全局的。

let

let 语句允许您创建一个变量,其范围限于使用它的块。

const

const 语句值只能赋值一次,不能重新赋值。 const 语句的作用域类似于 let 语句。

希望你明白。

我相信有时您需要重新声明一个变量以减少代码。

一个例子是这个生成唯一id的函数:

function makeUniqueId(takenIds) {
  do {
    var id = Number.parseInt(Math.random() * 10);
  } while (takenIds.includes(id))
}

可以这样调用

makeUniqueId([1,2,3,4,5,6,7])

在这里,我在 do 块内简单地声明了 id 变量,它得到了 "hoisted" 到函数范围。如果我使用 let,那会导致错误,因为 while 块看不到来自 do 块的变量。当然,我可以在 do..while 之前声明 let,但这会创建带有额外代码行的相同函数范围变量。

另一个例子 是当你将代码复制粘贴到 devtools 控制台并且每次变量都被重新声明时。

再举一个例子。如果你想让你的变量声明接近它们的用法但仍将它们视为函数全局变量怎么办?如果您以这种方式使用 let,您将在开发工具(所有那些 Block、Block 作用域)中获得相当混乱的体验。

但是 var 'keeps' 它们在一个 'Local' 列表中: