<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>
在 Internet Explorer 中输出是 0 到 53075,而在 Chrome 中是 12561。我不明白为什么不同的浏览器显示不同的输出以及它如何停止递归。谢谢。
最佳答案
这是一个递归函数,IE 和 Chrome 有不同的 Javascript 渲染引擎。 (Chrome 使用 V8)。很有可能是关于特定引擎内部的一些不重要的细节。在这种情况下,与堆栈大小有关(在它“爆炸”之前可以递归调用多少次)。
另一件需要考虑的事情是,对于常规程序来说,深入调用堆栈并不常见,除非您四处寻找或故意这样做,就像上面的示例一样。
当我说“深”时,我指的是一个计算语句(你的函数)必须返回一个值,如果它不返回一个值(而是调用另一个嵌套的功能),它必须首先评估它。这样,它就“深入”了。在你的例子中,它永远无法获得任何东西的返回值,直到它用完空间,因为最里面的函数永远不会返回任何东西。
这是另一个例子:
add(1, add(5, add(10, 20)))
在这个伪代码示例中,add 函数有 2 个参数,2 个数字相加。第二个参数需要先求值,然后才能得到返回值(因此它可以将它加到 1)。所以...它“暂停”1 + ...
的执行,然后运行第二个 add 函数,它做同样的事情。现在你有 2 个函数,它们是 1 + ...
,基本上是在等待“保持”。最后,最里面的函数返回一个值,30
,所以它被传递给 5 + 30
,也就是 35,现在 35 被传递给剩下的等待1 + ...
函数完成计算。
这可以认为是堆栈深度为 3(简单地说)。
基本上在您的程序中,它不会获得最终返回值(然后向上传递调用链)。相反,它只是用完了空间,然后死了。因此,您只是在测试各种 JavaScript 引擎的极限以及它们何时选择死亡。
关于javascript - 为什么不同的网络浏览器对这段代码显示不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48275929/