日期:2014-05-16  浏览次数:20579 次

setTimeout 为什么不会堆栈溢出?
假如代码如下
JScript code

  function callback(f) {
    f();
  } 

  function foo() {
    foo(); //执行1000次左右会发生堆栈溢出的错误, 
    //setTimeout(foo, 0); //永远不会堆栈溢出
  }
 foo()


这是什么原理?
请问假如我自己把callback函数也定义成setTimeout这样的,应该怎么写?

------解决方案--------------------
setTimeout 是伪异步执行的,你把函数交给setTimeout处理后,原来的函数不会等待,会继续执行,函数能够结束,资源也就可以释放
而不用setTimeout的时候,函数必须等待调用的函数返回后才能继续执行,但调用的函数又必须等待下一极函数......这样所有函数都不能结束,资源就一直不释放,故溢出



function callback(f) {
f();
setTimeout(function(){callback(f)},0);


------解决方案--------------------
function foo() {
foo();
  
}
 foo()

此处是无限递归,对于每一次的递归都回进行入栈操作,因为是无限递归,就不断的入栈,直到栈溢出为止(大约2M的容量吧)。
而settimeout调用foo
只是无限循环而已就是说
执行foo的时候入栈,
然后执行settimeout函数这个时候虽然它又继续调用自己,但是这里可以理解多线程操作了,只是开启另一个线程来启动foo,而当前线程仍然继续执行,当当前线程的foo执行完成后,自然就出栈了,每一次的FOO执行都是这个过程,所以栈里不会容量超标的