Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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 ES6_Javascript_Function_Loops_Ecmascript 6 - Fatal编程技术网

我如何得到这个输出?Javascript ES6

我如何得到这个输出?Javascript ES6,javascript,function,loops,ecmascript-6,Javascript,Function,Loops,Ecmascript 6,请在这里找到我的片段, for(var i=0;i console.log(i),10); }根案例: for (var i=0;i<11;i++) { setTimeout( console.log(i), 10); } 这将直接给出与ES6相同的结果 正确的方法是使用闭包: (变量i=0;i{ setTimeout(()=>console.log(i),10); })(i) ); }根案例: for (var i=0;i<11;i++) { setTimeout( c

请在这里找到我的片段,
for(var i=0;i console.log(i),10);
}
根案例:

for (var i=0;i<11;i++) {
  setTimeout( console.log(i), 10);
}
这将直接给出与ES6相同的结果

正确的方法是使用闭包:

(变量i=0;i{ setTimeout(()=>console.log(i),10); })(i) ); }根案例:

for (var i=0;i<11;i++) {
  setTimeout( console.log(i), 10);
}
这将直接给出与ES6相同的结果

正确的方法是使用闭包:

(变量i=0;i{ setTimeout(()=>console.log(i),10); })(i) ); }
用于(var i=0;i console.log(i),10);
}
  • 为我做参考
  • 推送堆栈超时
  • 我++
  • 推送堆栈超时
  • 我++

    。。。当js在执行for循环后有空闲的主“线程”时

    推超时10毫秒后,当主“线程”空闲时,将第一个超时推到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做

  • 可通过以下方式存档预期输出:

    for (var i=0;i<11;i++) {
      const num = i;
      setTimeout(() => console.log(num), 10);
    }
    
    for(var i=0;i console.log(num),10);
    }
    
    Const
    num
    i
    的值存储到执行时间。之后,它被垃圾收集。

    for(var i=0;i console.log(i),10);
    }
    
  • 为我做参考
  • 推送堆栈超时
  • 我++
  • 推送堆栈超时
  • 我++

    。。。当js在执行for循环后有空闲的主“线程”时

    推超时10毫秒后,当主“线程”空闲时,将第一个超时推到主“线程”,引用变量的值为11,因为for循环已完成。每次超时都要这样做

  • 可通过以下方式存档预期输出:

    for (var i=0;i<11;i++) {
      const num = i;
      setTimeout(() => console.log(num), 10);
    }
    
    for(var i=0;i console.log(num),10);
    }
    


    Const
    num
    i
    的值存储到执行时间。然后它被垃圾收集。

    只有一个
    i
    ,当计时器启动时,它的值是11。要扩展@Pointy所说的,
    setTimeout
    是一个异步函数,所以在第一个日志发生时,for循环已经完成运行(它执行
    i++
    ,直到
    i因为变量是引用​@Patrickbar,alos解释了为什么它以1开始打印。如果没有setTimeout()然后它将打印0..10,而不是1..11。此外,没有人提到第二个将在不等待的情况下打印数字,setTimeout将接收调用控制台的结果。logThere只有一个
    i
    ,当计时器触发时,其值为11。要扩展@Pointy所说的内容,
    setTimeout
    是一个异步函数,因此在发生第一个日志时,for循环已经完成运行(它执行
    i++
    ,直到
    ibecase变量被引用为止)​@Patrickbar,alos解释了为什么它开始打印1。如果没有setTimeout(),那么它将打印0..10,而不是1..11。此外,没有人提到第二个会在不等待的情况下打印数字,setTimeout将收到调用console的结果。Log是否尝试执行它?)检查最后一个数字。非常好。它正在返回堆栈。您可以在超时之前执行
    null&&
    您正在调用
    console.log
    ,在循环的每次迭代中立即将其返回值传递给
    setTimeout
    ,这将是未定义的。不要延迟对console.log的调用。尝试增加setTimeout延迟到更大的值,如
    10000
    ,您将看到它并没有延迟任何内容。@JonathanKuhn,对了!抱歉弄错了。Fixed@FieryCat问题是什么?记录的33和44不是来自console.log,它可能是上次setTimeout调用的内部id(setTimeout的返回值)。在控制台中运行代码时,它会自动记录上次调用的函数的返回值。除此之外,它看起来非常好。您是否尝试过执行它?)检查最后一个数字。非常好。它正在返回堆栈。您可以在超时之前执行
    null&&
    您正在调用
    console.log
    ,在循环的每次迭代中立即将其返回值传递给
    setTimeout
    ,这将是未定义的。不要延迟对console.log的调用。尝试增加setTimeout延迟到更大的值,如
    10000
    ,您将看到它并没有延迟任何内容。@JonathanKuhn,对了!抱歉弄错了。Fixed@FieryCat问题是什么?记录的33和44不是来自console.log,它可能是上次setTimeout调用的内部id(setTimeout的返回值)。在控制台中运行代码时,它将自动记录上次调用函数的返回值。除此之外,它看起来非常好。鉴于问题明确询问ES6,不,这不是解决方案。Hm..
    setTimeout(console.log(i),10);
    -console.log将在setTimeout之外执行。就是这样……我已经更新了答案否,这不是我的意思。我的意思是你不应该在ES6中使用IIFEs引入作用域。@Bergi,在这种情况下,你有什么建议?这是一个相当常见的解决方案:如果问题明确地询问ES6,不,这不是解决方案。嗯
    setTimeout(console.log(i),10);
    -console.log将在setTimeout之外执行。就是这样……我已经更新了答案no,这不是我的意思。我的意思是你不应该在ES6中使用IIFEs来引入作用域。@Bergi,在这种情况下你有什么建议吗?这是相当常见的解决方案: