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)。如果您处于草率模式(您不应该处于这种模式),作为浏览器旧版支持的一部分,您可能仍会遇到这种情况。
今天我 运行 遇到了一个奇怪的 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
不是块范围的,因此您的最后一个示例按预期工作。
const
是 ReferenceError
因为它不在 try
.
然而,const
早在 ES6 之前就在 some engines 中引入,作为 var
的不可变对应物,具有函数级作用域行为(并且没有 TDZ)。如果您处于草率模式(您不应该处于这种模式),作为浏览器旧版支持的一部分,您可能仍会遇到这种情况。