Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与javascript中的for循环输出混淆_Javascript_For Loop - Fatal编程技术网

与javascript中的for循环输出混淆

与javascript中的for循环输出混淆,javascript,for-loop,Javascript,For Loop,我在看你不知道的JS系列书 在这本书的“范围和结束”标题的第5章中,有一个我无法理解的for循环 for (var i=1; i<=5; i++) { setTimeout( function timer(){ console.log( i ); }, i*1000 );} for(var i=1;i是的,因为循环在第二秒内运行,当时i的值是6(最后一个i++没有进入循环)。因此它使用 该值将渲染5次 您可以使用以下命令打印1,2,3,4,5 for (let i=1; i&l

我在看你不知道的JS系列书

在这本书的“范围和结束”标题的第5章中,有一个我无法理解的for循环

for (var i=1; i<=5; i++) {
setTimeout( function timer(){
    console.log( i );
}, i*1000 );}

for(var i=1;i是的,因为循环在第二秒内运行,当时i的值是6(最后一个i++没有进入循环)。因此它使用
该值将渲染5次

您可以使用以下命令打印1,2,3,4,5

for (let  i=1; i<=5; i++) {
setTimeout( function timer(){
    console.log( i );
}, i*1000 );}

用于(设i=1;i循环在启动后立即运行,并将
i
的值增加到
6
。setTimeout中的回调函数在此之后运行1到5秒,并打印
i
的实际值,该值始终为
6
,因为循环在第0秒将其设置为
6

如果使用ES6 let,您可以看到您的12345

for (let i=1; i<=5; i++) {
  setTimeout( function timer(){
    console.log( i );
  }, i*1000 );
}

for(设i=1;i因为
i
是在
setTimeout
执行的函数的上下文之外定义的,当达到超时时,
i
的值为6,因此所有超时将执行函数并打印
i
的当前值

正如您所说,本章的标题是
闭包
,您可以使用闭包解决此问题

for (var i=1; i<=5; i++) {

 //This is a IIFE (Immediately-invoked function expression)
 //Simply put, a function that will be executed right after its definition
 (function(curr) {
   setTimeout( function timer(){
     console.log( curr );
   }, i*1000 );}
 })(i)

}

for(var i=1;i这里存在简单的逻辑。它第一次进入to循环并调用timer函数。但是timer函数将等待1秒。在这1秒中,for循环将执行所有6次,最后是i=6中的值

定时器功能也会在一秒钟内执行6次

计时器仅第一次执行前i=6中的值。 同样地,这个i也有值6下5次

如果需要,只需按如下方式更改代码

  for (var i=1; i<=11; i++) {
    setTimeout( function timer(){
    console.log( i );
   }, i*1000 );}

对于(var i=1;i让我一步一步地解释:

for (let  i=1; i<=5; i++) {
setTimeout( function timer(){
    console.log( i );
}, i*1000 );}

for(让i=1;我看这个问题的答案:当超时触发函数时(由于延迟),循环将完成,因此
i
的值将是最后一个值(即6)当第一次setTimeout启动时,循环结束,并且在调用时从关闭中获取的i值等于6。如果要保存i的当前值,请将此代码用于bind()
以用于(var i=1;iSo您试图说计时器函数将在循环运行5次后执行??如果是,那么它将如何打印6次5次?正如我们提到的,我使用i++=>增加i的值,检查i是否<=5,并且i的值为“6”,它不会进入循环。因此,值为“6”在最后一次尝试中。我希望它能回答你们的问题,也能给你们一个解决方案,让你们在谷歌上获得想要的输出它将为您提供与我提到的相同的答案。它与您使用的语言/脚本无关。您将在JS、C#、VB…等中获得相同的行为\n您是否为您的困惑找到了答案,或者您需要更多信息?请让我们知道您可以解释您的代码吗?我知道通过“let”的帮助,我们可以实现块范围。但是我的任务是离子在这里是如何产生差异的?是的,你可以使用“let”来打印1,2,3,4,5。通过这一点,我们可以理解每次使用“let”时,计时器函数中i的范围都不同