【问题标题】:When does a browser stop executing a recursive function in javascript?浏览器何时停止在 javascript 中执行递归函数?
【发布时间】:2012-10-31 10:03:54
【问题描述】:

我是 javascript 的初学者。我在javascript中尝试递归函数。

<html>
<head>
</head>
<body>
<script type = "text/javascript">
function first(){
    document.write(" first");
    first();
}
first();
</script>
</body>
</html>

浏览器打印“first”有限次。这是为什么?是否有任何特定机制在一定时间后停止“首先”打印?它是特定于浏览器的吗?

【问题讨论】:

  • 好吧,你在正确的网站上......它停止是因为大多数浏览器会在控制台中标记的en.wikipedia.org/wiki/Stack_overflow。不同的浏览器会在不同的时间停止执行,这取决于多种因素,例如 JavaScript 引擎和堆栈大小

标签: javascript


【解决方案1】:

递归函数不是无限的——它们只能继续运行,直到堆栈空间用完。

在这种情况下,“堆栈空间”是程序(即浏览器)为记住函数调用链而分配的内存,因此当你的函数返回时它知道返回到哪里。

那个内存空间是有限的,当它用完时,程序会停止并抛出错误(堆栈溢出错误)。

如果您使用的浏览器具有开发人员工具窗口(即几乎所有主流浏览器),您应该能够在错误发生时看到控制台窗口中显示的错误。

浏览器运行循环的确切次数将根据浏览器以及它分配给堆栈的内存量而有所不同。这不是您可以直接控制的东西——当然不是在浏览器上下文中;在较低级别的编程(例如 C/C++ 程序)中,您将拥有自己定义堆栈大小的工具,但在浏览器中,这些事情是您无法控制的。也就是说,浏览器应该为堆栈分配足够的内存,除非它进入无限循环,否则程序永远不可能碰到它。

【讨论】:

  • 除此之外,大多数浏览器如果执行时间过长,就会简单地停止执行 Javascript,以阻止浏览器变得无响应。
  • 有些浏览器实际上会询问用户是否要终止“脚本运行速度太慢”。
  • 那么,这是否意味着浏览器能够打印一定数量的字符。知道这个数字吗?
  • @shrigurunayak - 不,这与字符数无关,而是与您在没有返回的情况下进行的函数调用的数量有关。您可以打印的字符数有内存限制,但这是一个完全不同的讨论。在任何情况下,纯粹的“字符数”是一个任意问题,因为如果您输出任何类型的代码(例如 HTML、XML),浏览器从中创建的 DOM 树将比它包含的原始字符。使用这些东西,您会看到浏览器在内存不足时变慢并崩溃。
【解决方案2】:

检查这个问题JavaScript Infinite Loop? 并使用答案中的代码来实现循环:

window.onload = function start() {
slide();
}
function slide() {
var num = 0, style = document.getElementById('container').style;
window.setInterval(function () {
    // increase by num 1, reset to 0 at 4
    num = (num + 1) % 4;

    // -600 * 1 = -600, -600 * 2 = -1200, etc 
    style.marginLeft = (-600 * num) + "px"; 
}, 3000); // repeat forever, polling every 3 seconds
}

【讨论】:

    【解决方案3】:

    递归函数在所有语言中的工作方式都相似。您必须编写返回语句,如果条件为真,则返回某些内容,否则再次调用该函数。这一切都取决于要求,你想如何使用它。这可能是算法。

    function func_name(){
       if ( condition is true )
          return something
       ...
       ...
       ...
       func_name()
    }
    

    【讨论】:

    • 我知道。但只是想了解浏览器如何操纵它应该“首先”打印的次数。任何的想法?只是好奇。
    • 那是无限循环,永远不会停止。 OR 将等待内存溢出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多