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

时间:2015-10-31 22:10:24

标签: javascript try-catch const ecmascript-6 strict

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

让我们看一个代码示例,值得超过千言万语:

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

这将记录:

inside: bar
outside: bar

如果我们切换到"严格模式"虽然:

'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);

然后一切正常,即使在"严格模式":

inside: bar
outside: bar

任何人都可以帮助我理解为什么const作业在"严格模式"中没有在try / catch块内工作?

谢谢!

2 个答案:

答案 0 :(得分:16)

ECMAScript 6定义的

constblock-level variable declaration。您获得ReferenceError,因为它不在try范围之外。

然而,const早在ES6之前就被引入some engines,作为var的不可变对应物,具有功能级范围行为(并且没有TDZ)。如果您处于草率模式(您不应该这样),您可能仍会在浏览器的遗留支持中体验这一点。

答案 1 :(得分:4)

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

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

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

目前稳定的Chrome(46)就是这样做的。但是,Chrome 48可以在有或没有严格模式的情况下应用块范围。

var不是块作用域,因此您的上一个示例按预期工作。