社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
同学们在刚准备面试时肯定见过一道经典面试题:
for(var i = 0; i < 10; i++) {
setTimeOut(function(){
console.log(i)
})
}
// 输出 10 10 10 10 10 10 10 10 10 10
for(let i = 0; i < 10; i++) {
setTimeOut(function(){
console.log(i)
})
}
// 输出 0 1 2 3 4 5 6 7 8 9
有的同学就很疑惑,怎么肥事,这不一样嘛!
然后就去百度查查
然后百度就会告诉你:
第一个变量i是用var声明的,在全局范围内有效,所以全局中只有一个变量i,每次循环时,setTimeOut定时器里指的是全局变量i,而循环里的十个setTimeOut是在循环结束后才执行,所以输出十个10。
第二个变量i是用let声明的,当前的i
只在本轮循环中有效,每次循环的i其实都是一个新的变量,所以setTImeOut定时器的里面的i其实不是同一变量,所以输出0123456789
看完以后
似懂非懂
就算使用var定义的i是全局变量,每次循环都改变全局范围里的i的值,但是循环一次,执行一次setTimeOut啊,不也应该输出当前i值吗?
em…
不管,面试官问我我就照着这么回答就行了,面试官肯定明白我说的什么
其实之前我理解的也是很片面的,直到这两天看见一篇Google大佬的文章,全是英文,看了好半天****,下面
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!