JavaScript执行顺序:为什么这个条件执行后面的代码呢?

时间:2015-11-20 11:09:48

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

if(true) {
    let m = "yo";

    console.log(m);
}

console.log(m)

输出:

ReferenceError: m is not defined
yo

因此第4行的代码正在第8行的代码之后执行。

我对let的使用是否与此有关?

编辑:阅读评论后,我意识到这可能是因为我的运行时。以下是我每晚在Firefox中看到它的方式:

firefox nightly let m

编辑2 :如果这确实只是我的运行时,那么生产代码有什么影响,因为这样的事情?跨浏览器的行为不一致?我该如何防范?

1 个答案:

答案 0 :(得分:2)

所以我认为FF运行时的行为是可以的。粗略地看一眼规范(6.2.3.1等)表明代码应该逐行运行,直到第二个console.log(m),此时抛出ReferenceError

我怀疑它只是"看起来很有趣"因为控制台选择呈现第一个console.log和异常消息的顺序(例如,它与Chrome相反)。

无论是否将控制台的渲染顺序视为错误,我都会留给其他人。

以下内容似乎用于在记录异常之前显示警报来确认我的分析。

if(true) {
    let m = "yo";

    alert(m);
}

console.log(m)