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

Adi*_*M P 6 javascript firefox let ecmascript-6 firefox-developer-tools

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

    console.log(m);
}

console.log(m)
Run Code Online (Sandbox Code Playgroud)

输出:

ReferenceError: m is not defined
yo
Run Code Online (Sandbox Code Playgroud)

所以第4行的代码正在第8行的代码之后执行.

我的用法let与此有关吗?

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

火狐夜间让米

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

Ben*_*Ben 2

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

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

控制台的渲染顺序是否被视为错误,我留给其他人。

以下内容似乎证实了我的分析,并在记录异常之前显示了警报。

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

    alert(m);
}

console.log(m)
Run Code Online (Sandbox Code Playgroud)

  • @adityamenon *早*抛出引用错误并且根本不执行`if`和`console.log`*会*是一个错误。代码似乎执行得很好,错误后打印的日志令人困惑,但可能被“console”对象的实现所覆盖。是的,您应该提交错误,因为这种行为是非常意外的,但不是与 ES6 兼容,而是与 devtools 组件相关。(完成此操作后,请在此处链接) (2认同)