javascript - Chrome、Opera 和 Safari 控制台中脚本执行的奇怪结果

标签 javascript google-chrome safari opera developer-tools

这是一个脚本:

for(var i = 0; i < 5; i++) {
  setTimeout(function() { console.log(i); }, 0);
};

理论上它应该在控制台中只输出五个“5”。但是当我们在 Chrome、Opera 或 Safari 控制台中执行它时,除了结果之外还有一些奇怪的数字。操作系统是 macOS Sierra 10.12.1。

例如

Chrome 54.0.2840.98(64 位):

for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
2105
⑤ 5

Safari 10.0.1:

> for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
< 6
> for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
< 11
> for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
< 16

歌剧 39.0:

for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
5
⑤ 5                                    VM73:2
for(var i = 0; i < 5; i++) {
      setTimeout(function() { console.log(i); }, 0);
    };
10
⑤ 5                                    VM74:2

你可以自己尝试一下。有趣的是 - HTML 页面中包含的相同代码可以正常工作。根据打开控制台的选项卡,数字会有所不同。它是什么?猜测它是某种内部循环计数器,但不确定。另一个想法 - 控制台显示执行函数的返回值。也许是的。但 for 不会返回任何内容。至少不应该。相同的代码但没有 setTimeout 显示 undefined 而不是奇怪的数字,因为它应该有效。也许有人比我和互联网更了解它。任何想法都受到高度赞赏。对不起我的英语不好。谢谢!

最佳答案

这是最小的示例:

for(var i = 0; i < 5; i++) setTimeout(function() {})
> 71 (or whatever)

虽然语句没有值,但控制台会尝试“提供帮助”并输出最后计算的表达式返回的内容 - 在本例中,它是返回超时的 setTimeout(...) ID - 某个任意数字。

关于javascript - Chrome、Opera 和 Safari 控制台中脚本执行的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40947105/

相关文章:

html - 在新标签页的 iframe 中打开 PDF - Google Chrome

javascript - 使用 AppleScript 和 Javascript 在 Safari 网页上单击 "div button"

javascript - Safari 浏览器 Javascript 数组似乎对字符串排序不正确

javascript - 我如何设置noty通知的高度和宽度

html - Chrome 上的特殊字符渲染

javascript - PreventDefault后提交表单并解除绑定(bind)

javascript - 如何在新选项卡中打开页面(谷歌浏览器问题)

javascript - jQuery $.each 问题与 iOS Safari 上的循环

javascript - Backbone.js/下划线.js : Why isn't my template escaping

javascript - 服务调用后 Angular 范围未更新