执行如下代码,其中i用let声明。
for (let i = 1; i <= 5; i++) {
console.log(i)
}
console.log(i)
运行结果如下:我们发现let存在块级作用域,i的使用范围仅限在for循环内部使用。
如果将i用var来声明,因为var没有块级作用域的概念,所以虽然在块级作用域内声明,但全局环境下还是能被访问的。
我们将代码做如下变动,
for (var i = 1; i <= 5; i++) {
setTimeout(() => {
console.log(i)
}, 500)
}
运行结果如下,因为var没有块级作用的概念,当同步代码执行完毕后,此时i还在全局中,并且值为6,所以会打印出5行6。
虽然var没有块级作用域,但是有函数作用域,基于这一点我们可以对上述代码做一些更改,达到我们预期的效果。
for (var i = 1; i <= 5; i++) {
;((i) => {
setTimeout(() => {
console.log(i)
}, 500)
})(i)
}