关于for循环执行原理

ScriptTao
  • 86

为什么里面是Var的时候,输出五次5,里面是let的时候,输出0,1,2,3,4呢?

for(var i =0; i<5; i++) {
    setTimeout(function(){
     console.log(i);
    },1000);
}
回复
阅读 3.1k
3 个回答
chenqiao
  • 295
✓ 已被采纳

for循环执行的顺序为:
1 var i=0
2 i<5
3 i++

for循环中使用var声明变量,其效果和循环外是一样的,相当于:

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

同步的循环执行完毕之后,i被赋值为5,所以异步的setTimeout定义的函数执行时,自然全部输出5;
当使用let的时候,每一次循环都有一个作用域,每个域都有不同的i,所以异步函数执行时,输出0,1,2,3,4

这个不是 for 的,而是 ES6 新增的 let,constvar 的区别。可以参考下:文档let 和 const

先走for循环,然后才会走里面的定时器。而定时器里面的console会在循环结束的时候执行,所以输出都是5.
而使用let之后,有了块级作用域,那么里面就形成了闭包,在闭包被调用之前,这个块级作用域内部的变量不会被销毁,所以输出0,1,2,3,4

宣传栏