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

Javascript 在Chrome、Opera和Safari控制台中执行脚本的奇怪结果,javascript,google-chrome,safari,opera,developer-tools,Javascript,Google Chrome,Safari,Opera,Developer Tools,下面是一个脚本: for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 0); }; for(变量i=0;i

下面是一个脚本:

for(var i = 0; i < 5; i++) {
  setTimeout(function() { console.log(i); }, 0);
};
for(变量i=0;i<5;i++){
setTimeout(函数(){console.log(i);},0);
};
理论上,它应该在控制台中只输出五个“5”。但当我们在Chrome、Opera或Safari控制台中执行它时,除了结果之外,还有一些奇怪的数字。操作系统是macOS Sierra 10.12.1

例如

Chrome 54.0.2840.98(64位):

for(变量i=0;i<5;i++){
setTimeout(函数(){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
(变量i=0;i<5;i++)的
>{
setTimeout(函数(){console.log(i);},0);
};
< 6
>对于(变量i=0;i<5;i++){
setTimeout(函数(){console.log(i);},0);
};
< 11
>对于(变量i=0;i<5;i++){
setTimeout(函数(){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
for(变量i=0;i<5;i++){
setTimeout(函数(){console.log(i);},0);
};
5.
⑤ 5:73:2
对于(变量i=0;i<5;i++){
setTimeout(函数(){console.log(i);},0);
};
10
⑤ 5:74:2

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

以下是最简单的示例:

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

虽然语句没有值,但控制台会尝试提供“帮助”,并输出上一次计算的表达式返回的值—在本例中,返回超时ID的是
setTimeout(…)
—一些任意数字

以下是最简单的示例:

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

虽然语句没有值,但控制台会尝试提供“帮助”,并输出上一次计算的表达式返回的值—在本例中,返回超时ID的是
setTimeout(…)
—一些任意数字

它可能正在打印
setTimeout
中的返回值。可以使用
clearTimeout
将其清除。如果您再次运行,您将获得另一个值,因为每个超时都应该有自己的唯一数字来停止它


同时,您可能已经对控制台进行了筛选,只显示错误将其更改为显示全部,以查看实际日志。我想现在开发工具默认只有错误。(Safari)

它可能正在打印来自
setTimeout
的返回值。可以使用
clearTimeout
将其清除。如果您再次运行,您将获得另一个值,因为每个超时都应该有自己的唯一数字来停止它


同时,您可能已经对控制台进行了筛选,只显示错误将其更改为显示全部,以查看实际日志。我想现在开发工具默认只有错误。(Safari)

使用
let
而不是
var
将变量限制在同一范围内。在Chrome和Opera示例中,2105是
setTimeout
调用产生的最后一个计时器<代码>⑤ 5
表示数字
5
显然已经输出了五次。Safari似乎也在打印计时器ID,尽管我不知道它为什么不输出
I
,可能是控制台设置问题。我不关心
⑤ 5
,主要问题是关于
函数的
结果中的奇怪数字。@continued,至少在Chrome中没有关系。使用
let
而不是
var
将变量限制在Chrome和Opera示例中可能重复的相同范围内,2105是
setTimeout
调用产生的最后一个计时器<代码>⑤ 5
表示数字
5
显然已经输出了五次。Safari似乎也在打印计时器ID,尽管我不知道它为什么不输出
I
,可能是控制台设置问题。我不关心
⑤ 5
,主要问题是关于
函数的结果中的奇怪数字。@没完没了,至少在Chrome中没有关系。谢谢你的回答
clearTimeout
但是会立即销毁超时,尽管它需要一些时间来执行,所以不会执行任何操作
for(var i=0;i<5;i++){var to=setTimeout(function(){console.log(i);},0);clearTimeout(to);}未定义的
也许你提到了别的什么?但清除超时会产生可预测的未定义结果。无论如何,它不是在setTimeout内执行代码。我只是说返回的数字被用作clearTimeout的唯一ID。setTimeout返回唯一ID的原因。哦,好的,明白了。对不起,我听懂了。看起来它真的是这样工作的。谢谢你的回答
clearTimeout
但是会立即销毁超时,尽管它需要一些时间来执行,所以不会执行任何操作
for(var i=0;i<5;i++){var to=setTimeout(function(){console.log(i);},0);clearTimeout(to);}未定义的
也许你提到了别的什么?但清除超时会产生可预测的未定义结果。无论如何,它不是在setTimeout内执行代码。我只是说返回的数字被用作clearTimeout的唯一ID。塞蒂的原因是什么