在JavaScript中,我可以在var
语句中使用if
声明变量,而不使用块语句:
if (true)
var theAnswer = 42
但是,在没有块语句的情况下尝试使用let
或const
声明变量会产生错误:
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
。
这是什么原因?规范中是否有任何可以解释这种行为的内容?
答案 0 :(得分:0)
这将是一个没有什么收获的脚枪。 var
初始化被提升,因此保证变量始终存在于函数内部并始终具有值。 let
和const
的范围在块/函数中,并且不会提升初始化。这意味着,如果您提出的案例被允许,则会抛出以下代码:
if (false) let foo = 4;
console.log(foo);
因为let foo
行永远不会执行,所以永远不会初始化foo
变量。这意味着访问foo
变量将始终触发“临时死区”错误,就像
console.log(foo);
let foo = 4;
那样。
如果在没有直接阻止/函数包装的情况下禁止let
,let
将是危险的并且提供最小的收益。