首先需要举一个例子:

    1. let i = 0
    2. for(i = 0; i<6; i++){
    3. setTimeout(()=>{
    4. console.log(i)
    5. },0)
    6. }

    以上代码中先初始化函数值为0,然后每次循环打印出当前函数并++,正常情况下会打印出0,1,2,3,4,5,但是循环中存在setTimeout,该方法的作用是让当前代码执行完之后再执行该语句,当执行完该循环的时候,最后的值是6,所以最后打印出来的结果应该是6个6。
    这个时候如果稍微做出一个改动,把let i=0直接放到for循环中声明,变成
    for(let i = 0; i<6; i++){<br /> setTimeout(()=>{<br /> console.log(i)<br /> },0)<br /> }
    这时打印的结果就会发生变化,变成0,1,2,3,4,5,虽然有些不符合程序逻辑,但是这个是JS对新手做出的妥协,有些新手很难理解setTimeout为什么会执行出6个6,最后JS为了迎合这些新手直接把规则改成了“当JS中for和let在一起用的时候,每次循环都会多创建一个i,用于存储每次循环的结果”,虽然在一般人看来,这非常不符合逻辑。