【问题标题】:JavaScript execution order: why does this conditional execute after the code that follows it?JavaScript 执行顺序:为什么这个条件会在它后面的代码之后执行?
【发布时间】:2016-02-22 20:30:20
【问题描述】:
if(true) {
    let m = "yo";

    console.log(m);
}

console.log(m)

输出:

ReferenceError: m is not defined
yo

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

我对@9​​87654326@ 的使用与此有关吗?

编辑:阅读 cmets 后,我意识到这可能是因为我的运行时。这是我在 Firefox nightly 中看到的:

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

【问题讨论】:

  • 你在 Chrome 中运行这个?
  • I can't reproduce that. - 我在 FF 开发版中查看此内容。
  • 我在 Firefox Nightly 控制台中得到了这种行为。
  • 刚试过,我得到yo,然后ReferenceError: m is not defined似乎还可以
  • 我在 FF 41.0.2 OSX 中得到了这种行为。

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


【解决方案1】:

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

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

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

在记录异常之前显示的警报似乎证实了我的分析。

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

    alert(m);
}

console.log(m)

【讨论】:

  • 你能确认这是一个错误吗?我没有知识来推断你在说什么[我实际上很难理解:-)]。或许我应该提交一份报告?
  • @adityamenon early 抛出引用错误并且根本不执行ifconsole.log 是一个错误。代码似乎执行得很好,在错误令人困惑之后打印日志,但可能会被console 对象的实现所覆盖。是的,您应该提交一个错误,因为这种行为是非常出乎意料的,但不是与 ES6 兼容,而是与 devtools 组件有关。 (完成后,请在此处链接)
  • bugzilla.mozilla.org/show_bug.cgi?id=1226585 我希望它不会像错误报告那样糟糕,太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2019-10-03
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多