if语句中的变量重新赋值不抛出错误

时间:2017-11-08 13:19:45

标签: javascript node.js

为什么下面的代码不会针对变量重新分配发出警告/错误?

由于尾​​随逗号,我花了很多时间调试这样的事情。

当else语句中的代码移出if范围之外时,它会抛出正确的错误。

任何解释都会很棒。



let a

if (false) {
  // Nothing
} else {
  const b = 100,
    a = 10
}

console.log(a)
// undefined




4 个答案:

答案 0 :(得分:4)

Letconst个变量未被提升,并在块范围内创建。

因此,在您的代码中,您正在创建另一个变量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?