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)
}
【var和let的for循环】被let声明的作用域将会变成了一个块级作用域,也就是说每个setTimeout里面的i的值是不一样,也就是指向的是不同的i,那么将会依次输出0,1,2,3,4,5,6,7,8,9
推荐阅读
- web前端学习圈|推荐 9 个 GitHub 上练手项目(在线考试、仿美团、仿抖音、仿B站、仿头条...)
- Leetcode79单词搜索(深度遍历解法)
- ES6之迭代器(iterator)
- JavaScript的防抖与节流
- JavaScript|js实现支付页面的倒计时
- JavaScript案例|【javaScript案例】之支付10秒倒计时
- DOM|js实现放大镜效果(图片放大)—JavaScript
- 你不知道的那些字符串方法~
- 手写防抖和节流函数