假设您具有此功能序列(JavaScript)。...
A(function(){
console.log('done')
})
function A(done) {
a()
B(D, done)
}
function B(x, y) {
x(function(){
c()
C(y)
d()
})
}
function C(z) {
g()
setTimeout(z, 1000)
}
function D(z) {
h()
setTimeout(z, 2000)
}
function a() {
b()
c()
}
function b() {
// ... sync stuff
}
function c() {
e()
// ... sync stuff
f()
}
function d() {
// ... sync stuff
}
尝试使之具有某种复杂的调用堆栈。
我想知道的是在不同时间点调用堆栈的外观。例如,c();C(y);d()
序列。调用c()
时,要在该级别调用的 next 函数为C()
。因此,似乎将其推入堆栈(在评估c()
之前),C()
是返回位置。然后转到e()
和f()
(暂时忽略它们)。然后,它检查调用堆栈并返回到C()
。然后相同的过程。但是由于C()
是异步的,因此它会在d()
完成之前转到C()
。就像这样:
c c c c c c c ...?
C C C C C / \
e e f C d
f
这就是我试图映射调用堆栈时要去的地方。好像它会形成一棵树。现在想象一下,多个异步进程几乎同时开始。这就像是一棵树的多个分支。因此,不是调用堆栈,而是调用树。这最终使我怀疑调用堆栈如何得到准确评估。 何时将序列中的下一个函数压入调用堆栈,然后如何更新/删除最后完成的函数并找到返回到调用中下一个位置的方式堆栈/树。
想知道您是否可以指出任何描述此内容的资源,或者甚至可以解释我在上面描述的示例中调用堆栈的外观。