Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么var没有被弃用?_Javascript_Ecmascript 6_Deprecated_Var_Let - Fatal编程技术网

Javascript 为什么var没有被弃用?

Javascript 为什么var没有被弃用?,javascript,ecmascript-6,deprecated,var,let,Javascript,Ecmascript 6,Deprecated,Var,Let,最近在ES6发布之后,许多消息来源建议我使用“const”和“let”来代替“var”,并且我应该停止在JavaScript中使用“var” 我想知道的是,如果“var”在所有角度上都没有“let”的优势,那么他们为什么不修复var,甚至不推荐“var”,而不是让它们相互配合呢?向后兼容性。 你说得对,使用over没有真正的好处——如果你在函数的开头定义它们,它们的含义基本上是相同的 您是对的,没有真正的理由使用var编写新代码(除非相关) 互联网上有些网页已经有几十年的历史了,没有人会重写它们

最近在ES6发布之后,许多消息来源建议我使用“const”和“let”来代替“var”,并且我应该停止在JavaScript中使用“var”

我想知道的是,如果“var”在所有角度上都没有“let”的优势,那么他们为什么不修复var,甚至不推荐“var”,而不是让它们相互配合呢?

向后兼容性。 你说得对,使用over没有真正的好处——如果你在函数的开头定义它们,它们的含义基本上是相同的

您是对的,没有真正的理由使用
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
的行为,则
控制台.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
变量,它被“提升”到函数范围。如果我使用
let
,这将导致错误,因为
while
块看不到
do
块中的变量。当然,我可以在
do..while
之前declate
,但这将创建具有额外代码行的相同函数范围变量

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

再举一个例子。如果希望保持变量声明接近其用法,但仍将其视为函数全局变量,该怎么办?如果您以这种方式使用
let
,您将在开发工具(所有那些块、块范围)中获得相当混乱的过期性。

但是
var
将它们“保存”在一个“本地”列表中:

因为更改或删除它会中断大约10亿行代码。
var
let
在需要函数作用域而不是块作用域时更有用。
var
仍然有用法。因此,您的用例是在块内声明一个变量,然后在块外使用它?@jhpratt这不会通过任何好公司的代码审查。。。当然,这是任何一个门楣上的印记。谢谢你的回答。我很感激。然而,您的答案只解决了问题的一部分,即“为什么不反对var?”。如何从一开始就重构“var”而不引入任何“let”?有什么好的理由吗?再一次,向后兼容性。如果人们用你的问题评论中描述的可怕的方式使用<代码> var >代码(确实发生了),那么代码会改变意义和破坏,可能没有警告,就写它的开发者而言。我增加了一个例子。我总是认为你展示的例子是坏的形式。最好在更高的范围内声明变量。这意味着我不认为这是一个很好的使用
var
的例子。我同意-也许我应该让这一点更加明显。然而,这是一个例子,说明了为什么仅仅将
var
更改为
let
是一个坏主意,而这正是您的意图。您没有列出
var
的任何优点。您也可以在函数或全局级别使用
let
,那么除了在块中声明
var
等不愉快的操作,然后在该块之外使用它,还有什么好处呢?请注意,“变量声明”包括let和const(per),它们都是在执行代码之前处理的(但在执行代码时进行赋值)。;-)“正如你所看到的,id可能会被重新申报很多次……”不,不会。当控件进入新的执行上下文(或块范围声明的块)时,声明只处理一次。在执行makeUniqueId的任何主体之前,变量id与函数作用域一起存在。没有while块,有一个while表达式,您是对的,do中let声明的作用域。while循环不会扩展到while条件,因此如果在do块中使用let声明id,则id将超出作用域。感谢您捕捉到这一点!所有这些用例都不是保持var的充分理由。它带来的混乱和错误多于好处。所有的例子都正好相反:[ex.1]:id的逻辑应该在外部作用域中,并且必须在那里声明,而不是在do{}中,然后使用上面的let;[例2]:复制粘贴重新声明的变量极其危险;使用let将明确显示问题;[ex.3]类似于1:您说您希望声明一个接近其用法的变量,但您希望将其视为全局变量:因此声明必须在