今天我遇到了一个奇怪的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块内工作?
谢谢!
答案 0 :(得分:16)
const
是block-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
不是块作用域,因此您的上一个示例按预期工作。