What i all know about call stack is:个
-
如果只有一个函数被调用,则它将被推送到调用堆栈,并在其作业(job)完成或遇到返回语句时被移除.
-
如果一个函数调用另一个函数,则两个函数都留在调用堆栈中并按顺序弹出;子级,然后是父级.
-
如果子函数中有异步代码,则像语句2中所说的那样弹出both个.但当将来完成异步作业(job)时,子(?)函数将被放入Task Queue中,然后放入Call Stack中.
But when i used debugger in VSCode:个
- 我发现在完成
setTimeout()
之后,父函数和子函数都在调用堆栈中.让我的信念变成虚假的only child being in call stack. - 在下面的promise 解析后的代码中,在异步代码完成后,调试器中只有const
dummy2 = 'abc'
可用,而constdummy = 'XYZ'
不可用
function asyncfun(){
const innerDummy = '123'
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve('You are eligible for voting.');
},5000)
})
}
function outer(){
const dummy = 'XYZ';
asyncfun().then((msg)=>{
const dummy2 = 'abc'
console.log('Promise result:',msg)
})
}
outer();
-
请注意,我已经在
setTimeOut()
回调中设置了断点:resolve('You are eligible for voting.');
,以查看promise 完成/解析后谁在调用堆栈中,这将在future 5秒内发生.同时,当执行达到此行时,innerDummy
不可用. -
第
console.log('Promise result:',msg)
行的另一个断点,在上面的断点之后执行.这里的dummy
不可用,但dummy2
可以使用. -
由于上述变量在调试器中不可用,我感到困惑的是,是否将部分函数重新推送到调用堆栈或其他什么地方?