最近在ES6发布之后,许多消息来源建议我使用“const”和“let”而不是“var”,并且我应该在我的JavaScript中停止使用“var”。
我想知道的是,如果“var”在所有观点上都没有“let”的优势,那么他们为什么不修复var,甚至弃用“var”而不是让它们彼此并排?
你说对var
使用let
没有什么好处 - 如果你在函数的开头定义它们的含义基本相同。
你是对的,没有真正的理由使用var
编写新代码(除非this,如果相关)。
互联网上有几十年的历史,没有人会改写它们。从语言中删除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
会因为范围差异而引起参考错误。
我相信有时你需要重新声明一个变量来编写更少的代码。
一个例子是这个函数生成一个唯一的id:
function makeUniqueId(takenIds) {
do {
var id = Number.parseInt(Math.random() * 10);
} while (takenIds.includes(id))
}
可以这样调用
makeUniqueId([1,2,3,4,5,6,7])
在这里,我简单地在id
块中声明了do
变量,它被“提升”到函数范围。如果我使用let
,那将导致错误,因为while
块不会从do
块看到变量。当然我可以在let
之前对do..while
进行分解,但是这将创建具有额外代码行的相同函数范围变量。
另一个例子是当你将代码复制到devtools控制台并且每次变量重新声明时。
还有一个例子。如果你想让你的变量声明接近它们的用法但仍然将它们视为函数全局变量怎么办?如果你以这种方式使用let
,你会在开发工具(所有那些Block,Block范围)中得到相当混乱的expirience。
使用var const,一切都有各自的优点和缺点,并且取决于它们的用例。
var
在执行代码之前处理变量声明。使用var声明的JavaScript变量的范围是其当前执行上下文。在函数外声明的JavaScript变量的范围是全局的。
let
let语句允许您创建一个变量,其范围仅限于使用它的块。
const
const语句值可以分配一次,不能重新分配。 const语句的作用类似于let语句。
我希望你明白。