var的for循环
在js代码中,咱们应用for循环时,要定义应用一个变量,而当咱们应用var关键字来进行定义的时候,难免会呈现一些问题:
当咱们应用var关键字对变量进行定义的时候,将会产生变量晋升,就相似于正文外面写的那样,导致setTimeout外面的i始终是同一个数据。
并且这里setTimeout不会被立刻执行,它们会退出一个工作栈当中。同时,for循环是一个同步,而setTimeout是一个异步,异步办法要等到同步办法执行完之后才会开始执行,就导致了i的值曾经变成了9的时候,setTimeout都还没有开始执行,这就会导致10个setTimeout中console.log都输入9。
let的for循环
而当咱们在for循环中应用let申明变量时,将不会呈现这种状况:
for(let i=0;i<10;i++) { setTimeout(() => { console.log(i) }, 2000)}
被let申明的作用域将会变成了一个块级作用域,也就是说每个setTimeout外面的i的值是不一样,也就是指向的是不同的i,那么将会顺次输入0,1,2,3,4,5,6,7,8,9