for循环setTimeout闭包
for循环setTimeout闭包
for (var i = 0; i < 2; i++) { //个人理解:settimeout(stout)需要前面执行完才执行
setTimeout(() => { //第一轮 i=0 进入stout,但不执行stout,到for里面i++,这里i属于全局了全局的i此时等于1
console.log(i); //第二轮 i=1 进入stout,但不执行stout,到for里面i++,这里i属于全局了全局的i此时等于2
}, 1000); //第三轮 i=2 在for里面判断退出for循环 此时全局i=2,这时候开始执行2个settimeout console出来的是全局i,统一是三
}
//输出: 2 2
for (let i = 0; i < 2; i++) { //个人理解:settimeout(stout)需要前面执行完才执行
setTimeout(() => { //第一轮 i=0 进入stout,但不执行stout,stout里的i等于0,let块作用域的原因不穿回for里面,i++使用for里面的i 这时for里面的i=1
console.log(i); //第二轮 i=1 进入stout,但不执行stout,stout里的i等于1,let块作用域的原因不穿回for里面,i++使用for里面的i 这时for里面的i=2
}, 1000); //第三轮 i=2 退出循环 此时第一个stout的i=0,第二个stout的i=1,for循环已经退出,开始执行settimeout 输出0 1
}
//输出结果: 0 1
{
let a = 2; //个人理解:settimeout(stout)需要前面执行完才执行
{ //第一轮 m=0 进入stout,但不执行stout,stout里的m等于m=0+100,此时m=100,let块作用域的原因不穿回for里面,m++使用for里面的m(0++) 这时for里面的m=1
//第一轮 m=0 进入stout,但不执行stout,stout里的m等于m=1+100,此时m=101,let块作用域的原因不穿回for里面,m++使用for里面的m(1++) 这时for里面的m=2
for (let m = 0; m < 2; m++)//第三轮 m=2 退出循环 此时第一个stout的m=100,第二个stout的m=101,for循环已经退出,开始执行settimeout 输出100 101
{
setTimeout(() => {
m += 100;
console.log(m);
}, 500)
}
}
a++;
console.log(a);
a++;
console.log(a);
a++;
console.log(a);
}
//输出结果:3 4 5 100 101
前面懂了,这里也是一样的
{
var a = 2;
{
for (var m = 0; m < 2; m++) {
setTimeout(() => {
m += 100;
console.log(m);
}, 500)
}
}
a++;
console.log(a);
a++;
console.log(a);
a++;
console.log(a);
}
//输出结果:3 4 5 102 202