你现在是先定义了函数a,然后定义了函数b,然后再去执行函数a
即使你把代码改成这样依旧能够正常运行
a()function a() {
b()
}
function b() {
console.log(111)
}
因为JS运行环境会把定义的代码(变量/函数)提升到作用域的最前面
在执行过程中,先遇到for循环,for循环先进入线程。当i=1时,循环走到setTimeOut后,此时的for循环还没有执行完成,setTimeOut就会被放入一个地方(线程池)等待执行。此时for循环继续执行,当i=2时,for循环仍没有执行完,这时的setTimeOut仍会被放在线程池中等待执行……依次类推,直到for循环转完3遍后,for循环执行完了,此时线程空闲了,在线程池中等待执行的setTimeOut依次执行打印i,而for循环执行完成后,i变成了4,所以打印出了三个4。