【发布时间】:2020-04-14 23:19:39
【问题描述】:
我知道if 语句不像函数那样有自己的范围,这意味着它与包含上下文共享相同的范围。但如果是这样,为什么我允许再次重新声明相同的变量?
var foo = 123;
if (true) {
console.log(foo) // 123
var foo = 456; // Shouldnt it throw an error if refers to same variable?
}
console.log(foo) // 456
【问题讨论】:
-
两者都被提升并被识别为相同。
-
使用
var-let或const的众多陷阱之一会在这里抛出错误,但var会将两者提升到同一个声明 -
通过查看控制台日志的输出,这对我来说似乎是一个好问题,如果它是作用域的,我期待第一个日志未定义,第二个日志为 123,好问题。
-
var确实有范围,只是它的功能范围。规范中没有错误的原因可能是由于没有意外创建全局。这样做的好处是,您不必在函数顶部声明所有变量。 -
@Keith 很难将其称为“优势” -
var的这种行为更经常导致程序员试图在较低范围内声明和使用局部变量,然后意外地提升了变量另一个在更高范围内,然后他们修改了那个 - 因此为什么以这种方式(或根本不使用)使用var是不好的做法
标签: javascript node.js scope var