//修改以下代码,使之输出1,2,3,4,5
for(var i=1;i<=5;i++){
setTimeout(() => {
console.log(i)
}, 0)
}
//运行上述代码,输出6,6,6,6,6
//函数执行的顺序类似栈,后进先出,叫做函数调用栈,这里有个特殊的地方,就是setTimeout不在这个调用栈里面执行,而是加
到一个队列里面,等栈空了才去执行这个队列里面的东西;但是,var声明的变量存在变量提升,循环到最后一次,i=6了,所以每次
进去的i并不是刚进去的值,而是一个全局的i,这个i就是6,所以会输出6,6,6,6,6
//解法一 let
for(let i=1;i<=5;i++){
setTimeout(() => {
console.log(i)
}, 0)
}
//ES6中let声明的变量没有变量提升,而且变量有块级作用域 注:不能用const声明i,const一般声明一个常量,而且不能改变
//解法二 闭包
for(var i=1;i<=5;i++){
(function(a){
setTimeout(function timer() {
console.log(a)
}, 0)}
)(i);
}
//对闭包的理解还不够深刻,就不过多解释了...