一、let和var的区别
//let和var的区别相信列位已经耳熟能详了,在这里不做过多陈述,在第二段将用到的会提及一下
二、在定时器中的表现
- var
for (var i = 0; i < 5; i++) {
setTimeout(function () {
console.log("定时器" + i);
})
}
//5 * 定时器5
- let
for (let i = 0; i < 5; i++) {
setTimeout(function () {
console.log("定时器" + i);
})
}
//定时器0
//定时器1
//定时器2
//定时器3
//定时器4
三、解析
(1)产生这种的原因有三个
- let声明带来的块级作用域
- for循环机制(重点)
- var的变量提升
(2) var命令做了什么
- var首先带来了变量提升,将i提升到全局变量,所以var命令实际上只执行了一次
//在es6之前,js只有全局和局部作用域概念,局部作用也可以理解成函数作用域,所以此时在for循环用var声明的变量是全局变量 - 其次定时器是宏任务队列,for循环在这里相当于在Event Queue添加了五个事件
- 最后主线程任务执行