【问题标题】:Why is my while loop getting logged this way?为什么我的 while 循环会以这种方式记录?
【发布时间】:2020-06-20 16:36:56
【问题描述】:

为什么我的 while 循环会以这种方式被记录?是不是因为 V8 和 SpiderMonkey 的内部工作原理不同?

var counter = 0;
while (counter <= 10) {
    console.log(counter);
    counter++;
}

注意:在 Chrome 和 Firefox 控制台中尝试上述代码。

这些是我在执行上述代码时得到的结果。

在 Chrome 中:

在 Firefox 中:

为什么记录的结果不同?这是怎么回事?

【问题讨论】:

  • 您的问题标题含糊不清,其他人很难找到(并帮助提供答案)。考虑改写您的问题以定义“它”是什么,同时将您的猜测从标题转移到问题的主体。与外部图像的链接相比,复制和粘贴也更好。
  • 但是这里的上下文需要用图片来解释。抱歉,虽然我是 Stackoverflow 的新手!
  • @GiftedGeek 只是想让您知道您可以将图像复制到剪贴板中,然后将其直接粘贴到问题本身中,就像编辑问题后现在显示的那样。这是首选方法,因此人们不必离开问题然后返回即可理解它。
  • 感谢斯蒂芬让我知道,我会照着做的!

标签: javascript v8 console.log spidermonkey


【解决方案1】:

是的,内部运作方式不同。我相信您在这里注意到的差异实际上是因为在 WebKit 浏览器中,例如 Chrome 和 Safari,console.log 是异步的,而在 Firefox(和 Node.js)中它是严格同步的。

我第一次在 Trevor Burnham 的 Async JavaScript 一书中读到了这一点。你可以通过这个Google Books search link for Async JavaScript找到本书的相关部分,相关页面应该是顶部的第一个响应。

WebKit 的 console.log 的异步行为让许多开发人员感到惊讶。

为了帮助了解发生了什么,请尝试在控制台中输入以下内容:

var counter = 0
while (counter <= 10) { counter ++ }

您会看到,这自然会自行返回10 的值。这只是counterwhile 循环结束时的最终值。因此,因为 console.log 在 Firefox 中是同步的,所以 console.log 语句在返回 while 循环的返回值 10 的同时开始。因为它在 Chrome 中是异步的,所以 while 循环的返回值等待返回,直到所有 console.log 调用完成。 Chrome 和 Firefox 之间 console.log 的同步性质的不同之处在于该值是同时返回还是在所有 console.log 调用之后返回。这就是您注意到的差异的本质。

如果您仍然感到困惑,我建议您阅读异步代码的概念。这是一个中级概念,所以如果你刚刚开始并且还没有完全掌握它是可以的。上面引用的书是一个很好的资源,但你可以在 Mozilla 开发者网络上开始学习基础知识。以下是 MDN 为您提供的一些资源,可作为异步编程的入门:

【讨论】:

  • 太棒了,感谢斯蒂芬为我清理了这个,不胜感激!现在我对 JS 引擎有了更多的了解。顺便说一句,JavaScript 很有趣!会挖得更深!!!
  • 很高兴帮助@GiftedGeek!没错,JavaScript 很有趣。它是一种具有大量有趣功能的语言,并且一直在变得更好。很高兴我能在你的 JavaScript 旅程中帮助你。 ?????
  • 是的,斯蒂芬很有趣!再次感谢!
猜你喜欢
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2016-05-26
  • 2017-05-17
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多