我不明白为什么我的程序在执行下一行代码之前没有完成递归函数。

console.clear();
var a = 1;

function logA() {
  if (a<11) {
    console.log(a);
    a++;
    setTimeout(logA, 100);
  }
  else {
    return;
  }
}

logA();
console.log("after set timeout");

样品:
https://jsbin.com/moyanudeki/edit?js,console

堆栈中发生了什么?

最佳答案

首次调用logA()函数时,将按预期执行if块。 setTimeout(logA, 100);首次被调用。

在Javascript中,setTimeout()异步运行,因此它将在堆栈中等待100ms,然后执行下一个语句console.log("after set timeout");。从第一次超时开始执行此logA函数后,将触发另一个超时,依此类推。

因此,您的输出符合预期:

1
"after set timeout"
2
3
4
5
6
7
8
9
10

09-18 00:04