<html>
<head><title>Frontpage</title></head>
<h3>Hello</h3>
<script>
var a=1;
function myFunc(){
document.write(a+" ");
a=a+1;
myFunc();
}
</script>
<body><button type="button" onclick="myFunc()">Hey there</button></body>
</html>
&#13;
Internet Explorer中的输出为0到53075,而Chrome中的输出为12561.我不明白为什么不同的浏览器显示不同的输出以及它如何停止递归。谢谢。
答案 0 :(得分:4)
这是一个递归函数,IE和Chrome有不同的Javascript渲染引擎。 (Chrome使用V8)。更有可能的是,这是关于特定引擎内部的一些不重要的细节。在这种情况下,与堆栈大小有关(在“爆炸”之前可以递归调用的次数。)
要考虑的另一件事是,常规程序在调用堆栈中如此深入并不常见,除非你正在四处寻找或故意这样做,就像上面的例子一样。
当我说“深度”时,我指的是一个评估语句(你的函数)必须返回一个值,如果它不那样做(而是调用另一个嵌套)功能),它必须首先评估。通过这种方式,它将“更深入”。在你的例子中,它永远不能得到任何东西的返回值,直到它用完空间,因为最里面的函数永远不会返回任何东西。
这是另一个例子:
add(1, add(5, add(10, 20)))
在这个伪代码示例中,add函数需要2个参数,要添加2个数字。第二个参数需要首先进行评估,然后才能获得返回值(因此可以将其添加到1)。所以...它'暂停'1 + ...
的执行,然后运行第二个添加函数,它执行相同的操作。现在你有2个函数1 + ...
,基本上等待“保持”。最后,最里面的函数DOES返回一个值30
,以便传递给5 + 30
,即35,现在35传递给剩余的等待1 + ...
函数来完成计算。
可以认为堆栈深度为3(简单来说就是这样)。
基本上在你的程序中,它没有得到最终的返回值(然后调出调用链)。相反,它只是耗尽空间而死亡。因此,您只是测试各种javascript引擎的限制以及何时选择死亡。
答案 1 :(得分:1)
好吧,这段代码是无限循环。
您必须收到此类消息:
RangeError:超出最大调用堆栈大小。
每个浏览器都有自己的最大数量,以允许这种执行代码。 我真的不知道但是跑了两次而且我的号码相同,这意味着这个案例被严格否定了一些最大值。