Javascript 异步函数的回调函数是否在条件递归同步函数中推送到调用堆栈? 让canExit=false; setTimeout(函数(){ canExit=true; }, 1000); 函数recc(){ 如果(canExit){ 日志(“再见…”); }否则{ console.log(“总是其他…”); recc(); } } recc();

Javascript 异步函数的回调函数是否在条件递归同步函数中推送到调用堆栈? 让canExit=false; setTimeout(函数(){ canExit=true; }, 1000); 函数recc(){ 如果(canExit){ 日志(“再见…”); }否则{ console.log(“总是其他…”); recc(); } } recc();,javascript,Javascript,我想我明白了,如果我的理解有误,请告诉我 否,但如果recc()函数是异步的,则有可能。因此,永远不要依赖于递归函数中的值从异步函数更改而来。使用计时器启动对同步函数recc的调用,这与recc每次递归调用自身时是否创建新的附加堆栈帧没有区别 同步递归通常会在每次递归调用时向堆栈添加一个新帧,除非两者都是 编写递归调用是为了满足的条件,即直接返回通过调用自身返回的值,而无需对该值进行其他操作,以及 JavaScript引擎通过不生成新的堆栈框架来识别和优化尾部递归 您当前的代码导致出现语法错误,

我想我明白了,如果我的理解有误,请告诉我

否,但如果recc()函数是异步的,则有可能。因此,永远不要依赖于递归函数中的值从异步函数更改而来。

使用计时器启动对同步函数
recc
的调用,这与
recc
每次递归调用自身时是否创建新的附加堆栈帧没有区别

同步递归通常会在每次递归调用时向堆栈添加一个新帧,除非两者都是

  • 编写递归调用是为了满足的条件,即直接返回通过调用自身返回的值,而无需对该值进行其他操作,以及
  • JavaScript引擎通过不生成新的堆栈框架来识别和优化尾部递归

  • 您当前的代码导致出现
    语法错误
    ,您可能需要更正该错误。那里也没有任何
    async
    函数?这个术语有一个非常具体的含义是的,我纠正了它,希望setTimout是异步的@
    setTimeout
    setInterval
    调用中的SrikanthGowda函数只有在所有同步调用完成后才会运行。这就是为什么使用
    setInterval(,0)
    异步运行函数的原因。@nickzoum我知道,这就是我想说的,异步函数的回调函数不会被推到调用堆栈。