访问' let'时,ReferenceError不会抛出声明前的变量

时间:2015-12-11 10:26:14

标签: javascript ecmascript-6 let firefox-developer-tools

我试图在Firefox V30.0 Scratchpad中执行以下代码:

function do_something() {
  console.log(foo); // ReferenceError
  let foo = 2;
}
do_something();

预期的行为是我的程序应该抛出引用错误,因为我在它的声明之前访问let变量。但是,我没有得到预期的行为,程序被执行,结果如下

undefined

你能解释一下,为什么会这样呢?

2 个答案:

答案 0 :(得分:6)

根据MDN compatibility table,自v35起,Firefox确实支持时间死区语义。

此外,您应始终确保使用严格模式。由于担心打破传统网络,一些ES6功能在草率模式下不可用。尽管Firefox'尽管如此,它不应该影响这种特殊情况。已经有let用法的悠久历史。

答案 1 :(得分:4)

让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不支持所谓的“时间死区”。查看浏览器是否支持ES6规范特定部分的好地方是Kangax的Ecmascripts兼容性表(https://kangax.github.io/compat-table/es6/#test-let)。