JavaScript函数的执行时机

114 阅读1分钟

例子1

let i = 0
for(i = 0; i<6; i++){
    setTimeout(()=>{
        console.log(i)  
    },0)
}
  • 结果:6 6 6 6 6 6
  • 解析:此处变量i为全局变量。setTimeout(function(),0) 的作用是在当前代码执行完后,再执行function()内容,所以以上代码段中是等for循环执行完后(i累加到6)再执行6次console.log(i)(打印的值为此时i的值),所以打印出6个6。

例子2

for(let i = 0; i<6; i++){
    setTimeout(()=>{
        console.log(i)
    },0)
}
  • 结果:1 2 3 4 5 6
  • 解析:此处变量i为局部变量,且用ES6语法let i = 0声明。按照setTimeout(function(),0)原理结果理应为:6 6 6 6 6 6,但是JS为let声明的变量做了优化,每次进入setTimeout()时,将i的值复制一份后存储起来,等到for循环结束时,再将6个存储起来的i值打印出来。所以结果的值是每次进入setTimeout()的i的值,即1 2 3 4 5 6。