为什么不同的网络浏览器会为这段代码显示不同的输出?

Deb*_*ba 5 javascript

 <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> 
Run Code Online (Sandbox Code Playgroud)

Internet Explorer中的输出为0到53075,而Chrome中的输出为12561.我不明白为什么不同的浏览器显示不同的输出以及它如何停止递归.谢谢.

Tal*_*boy 4

这是一个递归函数,IE 和 Chrome 有不同的 Javascript 渲染引擎。(Chrome 使用 V8)。很可能是有关特定发动机内部的一些不重要的细节。在这种情况下,与堆栈大小相关(在“爆炸”之前可以递归调用某件事的次数)。

另一件需要考虑的事情是,常规程序深入调用堆栈的情况并不常见,除非您是在闲逛或故意这样做,就像上面的示例一样。

当我说“深度”时,我指的是一个被评估的语句(你的函数)必须返回一个值,如果它这样做(而是调用另一个嵌套函数),它必须首先评估它。如此一来,就更“深入”了。在您的示例中,它永远无法获取任何内容的返回值,直到空间不足,因为最里面的函数永远不会返回任何内容。

这是另一个例子:

add(1, add(5, add(10, 20)))
Run Code Online (Sandbox Code Playgroud)

在这个伪代码示例中,add 函数采用 2 个参数,即 2 个要相加的数字。第二个参数需要先求值,然后才能获得返回值(因此可以将其加到 1)。所以...它“暂停”执行1 + ...,然后运行第二个 add 函数,该函数执行相同的操作。现在你有两个功能1 + ...,基本上是等待“保持”。最后,最里面的函数确实返回一个值 ,30因此它被传递给5 + 3035,现在 35 被传递给剩余的等待1 + ...函数以完成计算。

可以认为堆栈深度为 3(简单地说)。

基本上在您的程序中,它不会获得最终的返回值(然后传递调用链)。相反,它只是耗尽了空间,然后就死掉了。因此,您只是测试各种 javascript 引擎的极限以及它们何时选择死亡。