function f1 () { console.log('f1'); };function f2 () { console.log('f2'); f1();};function f3 () { console.log('f3'); };function f4 () { console.log('f4'); f3();};function f5 () { console.log('f5'); setTimeout(f4, 0);};function start () { f2(); f5(); console.log('start end');}start();1.start入执行栈,执行
2.f2入栈,f2执行,输出 'f2'
3.f1入栈,f1执行,输出 'f1'
4.f1执行完毕,f1出栈
5.f2执行完毕,f2出栈
6.f5入栈,f5执行,输出 'f5'
7.setTimeout回调函数加入事件队列
8.f5执行完毕,f5出栈
9.start执行完毕, 输出 'start end', start出栈
10.执行栈为空,检查事件队列,将setTimeout事件压入执行栈,f4入栈
11.f4入栈,f4执行,输出 'f4'
12.f3入栈,f3执行,输出 'f3'
13.f3执行完毕,f3出栈
14.f4执行完毕,f4出栈, 执行栈为空,事件队列为空,结束
执行输出结果为:
f2
f1
f5
start end
f4
f3