看到这样一个题
function fn (){
setTimeout(fn,0)
}
fn()
请问执行这段代码会出现堆栈溢出问题吗?
如果改成下面这样代码的话呢?
function fn1 (){
setTimeout(fn1(),0)
}
fn1()
我们先说结果, 第一段代码不会报堆栈溢出错误,它可以一直执行下去
第二段代码会报堆栈溢出错误。
分析原因:
第一段代码中,setTimeout函数是一个异步函数,一开始调用fn函数执行上下文进入栈中,开始运行fn函数里面的代码,然后通知计时线程去计时,此时 栈中的fn函数就算是执行完了,就出栈了,然后计时结束后进入事件队列,又重新运行fn函数,又入栈,如此循环往复,永远不会出现栈溢出问题。
第二段代码中,因为setTimeout的第一个参数是函数调用,它需要函数执行完的结果作为第一个参数的值放入事件队列,但是此时fn1函数一直无法执行完成,没有执行完就没办法出栈,最终就会导致栈溢出。