为什么下面的代码不会针对变量重新分配发出警告/错误?
由于尾随逗号,我花了很多时间调试这样的事情。
当else语句中的代码移出if范围之外时,它会抛出正确的错误。
任何解释都会很棒。
let a
if (false) {
// Nothing
} else {
const b = 100,
a = 10
}
console.log(a)
// undefined

答案 0 :(得分:4)
Let
和const
个变量未被提升,并在块范围内创建。
因此,在您的代码中,您正在创建另一个变量a
,它是一个const。一旦范围结束,它将再次指向外面的a
。
例如,如果您尝试在同一个块中重新分配它,它将抛出错误,因为您无法更改const的值。
let a
if (false) {
// Nothing
} else {
const b = 100,
a = 10
a = 2;
}
console.log(a)
// undefined
正如Bergi所指出的,所有变量都被提升。但是他们被提升的方式给人的印象是他们没有被吊起来。您可以在此处阅读完整说明:Are variables declared with let or const not hoisted in ES6?
答案 1 :(得分:2)
为什么代码不会抛出关于变量重新赋值的警告/错误?
因为您没有重新分配变量(这是您真正想要的,分配let a
变量),您将使用const
重新声明它 - 并且在不同范围(在本例中为else
块)。如果你在相同的范围内重新声明它(例如let a; const a = 5
),它确实会抛出一个错误。内部作用域中的阴影声明(隐藏现有名称)不是错误,实际上本地作用域必须工作且不受其周围环境的影响。
如果您想获得关于此的警告,请使用具有针对阴影声明的规则的linter,例如: in ESLint
答案 2 :(得分:0)
在else条件下,a被声明为const.So,无论其他条件中的值(u赋值为10)。你必须把;在b声明结束时。否则a
将被声明为const.So,a
值在其他条件的外部未定义。
let a
if (false) {
// Nothing
} else {
const b = 100;
a = 10
}
console.log(a)

答案 3 :(得分:-2)
在这种情况下,这是因为它永远不会进入else语句,它总是错误的。
我通常使用alert(字符串);要调试并知道变量的值,请在if的开头尝试一个,或者使用console.log()
我还建议您阅读以下有关let或var的内容: What's the difference between using "let" and "var" to declare a variable?