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

标签 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> 

在 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/

相关文章:

javascript - 使用 jQuery 获取标签内的文本

javascript - 如何在 Python 中正确粘贴有效的 JS 代码作为字符串,跳过所有可能的字符并且不插入任何内容?

javascript - THREE.js 编辑器 : How to access main script in an example

javascript - Jquery Complex 环绕未包含的项目组

javascript - 禁用的按钮颜色在 IE9 中未正确呈现

javascript - html - 如何重叠 Div 包含父 Div 上的链接?

javascript - 使用ajax提交表单并提交阻止并发送文件控件c#的选定文件

javascript - 使用单选按钮的正确方法

javascript - 如何检查已加载的图像是否已加载到 JavaScript 中?

javascript - 如何向数组中的新项目添加独立增量计数器。 Vue.js