JavaScript: 在 try / catch 中用严格模式定义一个常量

JavaScript: define a constant inside try / catch with strict mode

今天我 运行 遇到了一个奇怪的 JS 错误,在 try/catch 块中使用 const,我想更好地了解导致它的原因。

让我们看一个代码示例,它值一千多字:

try {
  const FOO = 'bar';
  console.log('inside:', FOO);
} catch (e) {}
console.log('outside:', FOO);

这将记录:

inside: bar
outside: bar

不过,如果我们切换到 "strict mode":

'use strict';
try {
  const FOO = 'bar';
  console.log('inside:', FOO);
} catch (e) {}
console.log('outside:', FOO);

现在相同的代码产生错误:

ReferenceError: FOO is not defined

如果我们将 const 更改为 var

'use strict';
try {
  var foo = 'bar';
  console.log('inside:', foo);
} catch (e) {}
console.log('outside:', foo);

然后一切正常,即使在 "strict mode":

inside: bar
outside: bar

谁能帮我理解为什么 const 赋值在 "strict mode" 的 try/catch 块内不起作用?

谢谢!

您的 JavaScript 运行时部分实现了 ES6 const

ReferenceError 是您第一个示例的预期行为,因为 const is block scoped 并且您在定义 try 块之外访问 FOO

您使用的引擎支持 const 语法,但它仅在严格模式下应用块范围语义。

目前稳定版Chrome(46)就是这样做的。 Chrome 然而,48 在有或没有严格模式的情况下应用块作用域。

var 不是块范围的,因此您的最后一个示例按预期工作。

根据 ECMAScript 6 的定义,

const。你得到一个 ReferenceError 因为它不在 try.

之外的范围内

然而,const 早在 ES6 之前就在 some engines 中引入,作为 var 的不可变对应物,具有函数级作用域行为(并且没有 TDZ)。如果您处于草率模式(您不应该处于这种模式),作为浏览器旧版支持的一部分,您可能仍会遇到这种情况。