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

Pen*_*ica 9 javascript const try-catch strict ecmascript-6

今天我遇到了一个奇怪的JS错误,const在try/catch块里面工作,我想更好地理解导致它的原因.

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

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

这将记录:

inside: bar
outside: bar
Run Code Online (Sandbox Code Playgroud)

如果我们切换到"严格模式",但:

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

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

ReferenceError: FOO is not defined
Run Code Online (Sandbox Code Playgroud)

如果我们改变constvar:

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

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

inside: bar
outside: bar
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我理解为什么const在"严格模式"下,赋值在try/catch块中不起作用?

谢谢!

Ber*_*rgi 16

const,如ECMAScript 6所定义,是一个块级变量声明.你得到一个ReferenceError因为它不在范围之外try.

然而,在ES6之前很久就const被引入了一些引擎,作为一个不可变的对应物var,具有功能级范围行为(并且没有TDZ).如果您处于草率模式(您不应该这样),您可能仍会将此作为浏览器遗留支持的一部分.