递归函数中的奇怪行为

A. *_*lff 1 javascript recursion jquery

有人可以解释为什么第二个函数不会给我们带来堆栈溢出吗?

//stack overflow on call
function test1() {
    test1();
}
//no stack overflow, nor beer
function test2() {
    setTimeout(test2, -500); //back to the future
}
Run Code Online (Sandbox Code Playgroud)

I H*_*azy 8

因为它不是递归的.该test2函数能够返回,一段时间后,setTimeout通过创建的匿名函数调度另一个调用.

显然,你不能回到过去.setTimeout有最短的持续时间.


FWIW,匿名功能是不必要的.你可以做到setTimeout(test2, -500).

  • @roasted即使是零超时也会导致短暂的延迟.换句话说,没有浏览器在从`setTimeout()`返回之前立即调用回调. (2认同)