Javascript i的值是否被复制到下一个词汇环境?I';我很困惑

Javascript i的值是否被复制到下一个词汇环境?I';我很困惑,javascript,Javascript,我不太明白代码中发生了什么,为什么只打印值1 for(设i=0;iconsole.log(i)); i++; }这是因为setTimeOut方法在循环结束后运行。在本例中,您将在循环中再次递增该值,因此在此之后,let作用域将给出i的值,即1 改为这样做: for(设i=0;iconsole.log(i)); }让在循环的中工作的方式是,对于每个循环迭代,创建一个独立的变量;这主要是因为像您这样的循环中的闭包不像以前那样复杂。因此,请记住: 您可以从i=0开始 由于0

我不太明白代码中发生了什么,为什么只打印值1

for(设i=0;i<2;i++){
setTimeout(()=>console.log(i));
i++;

}
这是因为
setTimeOut
方法在循环结束后运行。在本例中,您将在循环中再次递增该值,因此在此之后,let作用域将给出
i
的值,即
1

改为这样做:

for(设i=0;i<2;i++){
setTimeout(()=>console.log(i));

}
让在循环的中工作的方式是,对于每个循环迭代,创建一个独立的变量;这主要是因为像您这样的循环中的闭包不像以前那样复杂。因此,请记住:

  • 您可以从
    i=0
    开始
  • 由于
    0<2
    ,第一个循环体使用
    i
    的副本执行
  • 您可以计划一个回调日志记录
    i
    的副本
  • 然后用
    i++递增
    i
    位于循环体的末尾。现在,
    i
    的副本具有值
    1
  • 然后,当
    for
    循环的增量部分完成时,将创建一个第二个
    i
    ,给定第一个(
    1
    )的值,然后递增。因此第二个
    i
    的值为
    2
  • 由于
    2<2
    为false,因此循环停止
  • 随后,执行步骤#3中计划的calback,记录第一个
    i
    1
    )的值

  • 这与使用
    var
    而不是
    let
    时代码的行为方式有根本不同,这也是
    let
    如此方便的原因之一。

    如果有人在控制台中尝试此操作,您可能会在控制台中看到
    0
    1
    ,但请记住,
    0
    不会被记录,它是返回值。实际上只记录了
    1
    。非常感谢,这真的很有帮助。