在声明之前访问 'let' 变量时不会抛出 ReferenceError
ReferenceError is not throwing when accessing 'let' variable before declaration
我尝试在 Firefox V30.0 Scratchpad 中执行以下代码:
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}
do_something();
预期的行为是我的程序应该抛出引用错误,因为我在声明之前访问了一个 let
变量。但是,我没有得到预期的行为,程序得到执行,结果如下
undefined
你能解释一下吗,为什么会这样?
让 ES6 中的变量被提升到声明它们的块的顶部。在声明之前引用变量将导致 ReferenceError (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let)。因此,您预期在这种情况下会发生 ReferenceError 是正确的。
在这种情况下没有发生 ReferenceError 的原因是因为 FF 30 不支持所谓的 "temporal dead zone"。了解浏览器是否支持 ES6 规范的特定部分的好地方是 Kangax 的 Ecmascripts 兼容性 table (https://kangax.github.io/compat-table/es6/#test-let).
根据 MDN compatibility table,Firefox 仅从 v35 开始才支持临时死区语义。
此外,您应该始终确保使用严格模式。由于担心破坏遗留网络,某些 ES6 功能在 sloppy 模式下不可用。尽管 Firefox 已经有很长的 let
使用历史,但它不应该影响这种特定情况。
我尝试在 Firefox V30.0 Scratchpad 中执行以下代码:
function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}
do_something();
预期的行为是我的程序应该抛出引用错误,因为我在声明之前访问了一个 let
变量。但是,我没有得到预期的行为,程序得到执行,结果如下
undefined
你能解释一下吗,为什么会这样?
让 ES6 中的变量被提升到声明它们的块的顶部。在声明之前引用变量将导致 ReferenceError (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Temporal_dead_zone_and_errors_with_let)。因此,您预期在这种情况下会发生 ReferenceError 是正确的。
在这种情况下没有发生 ReferenceError 的原因是因为 FF 30 不支持所谓的 "temporal dead zone"。了解浏览器是否支持 ES6 规范的特定部分的好地方是 Kangax 的 Ecmascripts 兼容性 table (https://kangax.github.io/compat-table/es6/#test-let).
根据 MDN compatibility table,Firefox 仅从 v35 开始才支持临时死区语义。
此外,您应该始终确保使用严格模式。由于担心破坏遗留网络,某些 ES6 功能在 sloppy 模式下不可用。尽管 Firefox 已经有很长的 let
使用历史,但它不应该影响这种特定情况。