function foo1() {
console.log('foo1');
setTimeout(foo1, 0);
}
foo1();
setTimeout(function(){
console.log('settimeout');
},0)
console.log('同步代码');
输出顺序:
foo1 -> 同步代码 -> foo1 ->settimeout -> foo1(无限输出)
- 调用foo(), 执行里面的console.log('foo1')一次 输出foo1
- 把setTimeout(foo1,0) 放入任务队列
- 把第二个setTimeout放入任务队列
- 执行console.log('同步代码') 输出同步代码
- 主线程空,开始检查任务队列,先执行setTimeout(foo1,0)的回调, 即执行一次foo 输出foo1,再把setTimeout(foo1,0) 放入任务队列
- 执行3中放入的setTimeout的回调函数 输出settimeout
- 执行5中放入的setTimeout(foo1,0),执行foo1 输出foo1,再继续放一个新的setTimeout(foo1,0)进去
- 重复7的步骤:把回调放入主线程执行->回调中设置一个新的setTimeout放入队列->回调执行完,主线程为空,检查队列->又执行新的回调....... 无限输出foo1
- 无限输出的时候,主线程永远只有一个任务,因此不会造成栈溢出