【发布时间】:2016-12-03 11:11:45
【问题描述】:
这是一个脚本:
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
Opera 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 而不是奇怪的数字,因为它应该可以工作。也许有人比我和互联网更了解它。任何想法都受到高度赞赏。对不起我的英语不好。谢谢!
【问题讨论】:
-
使用
let而不是var将变量限制在同一范围内 -
在 Chrome 和 Opera 示例中,2105 是
setTimeout调用产生的最终计时器。⑤ 5表示数字5显然已经输出了五次。 Safari 似乎也在打印计时器 ID,虽然我不知道为什么它不输出i,可能是控制台设置问题。 -
我不关心
⑤ 5,主要问题是关于for函数的“结果”中的奇怪数字。 -
@Endless,至少在 Chrome 中没关系。
标签: javascript google-chrome safari opera developer-tools