这是一个脚本:
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/