执行时机决定了函数的结果
案例一
let a = 1
function fn(){
console.log(a)
}
fn() // 1
结果为1, 因为一开始声明了a, a的值为1,然后调用函数 fn, 打印出a(1)。
案例二
let a = 1
function fn(){
console.log(a)
}
a = 2
fn() // 2
结果为2,调用fn之前,a被赋值为2。
案例三 有SetTimeout的情况1
let a = 1
function fn(){
setTimeout(()=>{
console.log(a)
},0)
}
fn() // 2
a = 2
结果为2,因为运行完再执行fn,运行完后a已经是2了。
你正在打游戏,还剩下最后一关,这时候你妈妈让你去吃饭,你嘴上说马上(相当于setTimeout,但其实会把游戏打完之后再去吃饭。
案例四 有SetTimeout的情况2
let i = 0
for(i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
//会打印出6个6
setTimeout会等到当前代码的for循环执行完了,再去执行console.log(i),而for循环执行完之后,i已经是6了,所以会打印出6个6
案例四 有SetTimeout的情况3
for(let i = 0; i<6; i++){
setTimeout(()=>{
console.log(i)
},0)
}
// 0 1 2 3 4 5
let 会单独创建一个作用域,相当于有6个i,最后分别打出0,1,2,3,4,5
打0,1,2,3,4,5的其他方法
let i = 0
for (i = 0; i < 6; i++) {
setTimeout((function(i){
return function() {
console.log(i);
}
}(i)),0)
} // 0 1 2 3 4 5