使用带有let / const语句的if语句,不带块语句

时间:2016-10-27 20:09:18

标签: javascript if-statement syntax ecmascript-6

在JavaScript中,我可以在var语句中使用if声明变量,而不使用块语句:

if (true)
  var theAnswer = 42

但是,在没有块语句的情况下尝试使用letconst声明变量会产生错误:

if (true)
  let theAnswer = 42

Chrome会引发SyntaxError: Unexpected identifier,Firefox - SyntaxError: lexical declaration not directly within block

if (true)
  const theAnswer = 42

此处Chrome会引发SyntaxError: Unexpected token const,Firefox - SyntaxError: const declaration not directly within block

这是什么原因?规范中是否有任何可以解释这种行为的内容?

1 个答案:

答案 0 :(得分:0)

这将是一个没有什么收获的脚枪。 var初始化被提升,因此保证变量始终存在于函数内部并始终具有值。 letconst的范围在块/函数中,并且不会提升初始化。这意味着,如果您提出的案例被允许,则会抛出以下代码:

if (false) let foo = 4;

console.log(foo);

因为let foo行永远不会执行,所以永远不会初始化foo变量。这意味着访问foo变量将始终触发“临时死区”错误,就像

一样
console.log(foo);
let foo = 4;

那样。

如果在没有直接阻止/函数包装的情况下禁止letlet将是危险的并且提供最小的收益。