javascript递归导致的堆栈溢出
function foo() {
foo();
//setTimeout(foo, 0);
}
foo()
原因是每次执行代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,成千上万个此类空间累积起来,自然就超过线程的栈空间了。那么如何解决此类问题?
此处是无限递归,对于每一次的递归都回进行入栈操作,因为是无限递归,就不断的入栈,直到栈溢出为止(大约2m的容量吧)。
而settimeout调用foo
只是无限循环而已就是说
执行foo的时候入栈,
然后执行settimeout函数这个时候虽然它又继续调用自己,但是这里可以理解多线程操作了,只是开启另一个线程来启动foo,而当前线程仍然继续执行,当当前线程的foo执行完成后,自然就出栈了,每一次的foo执行都是这个过程,所以栈里不会容量超标的。
海阔天空 在勇敢以后
要拿执着 把命运的锁打破
冷漠的人 谢谢你们曾经看轻我
让我不低头 更精彩的活
海阔天空 狂风暴雨以后
转过头 对旧心酸一笑而过
最懂我的人 谢谢一路默默的陪我
让我拥有 好故事可以说
看未来 一步步来了