2

在 javascript 中,如果你有一个使用 console.log 的无限循环,它会将所有内容写入控制台,直到它溢出。但是,如果您使用 document.write 执行此操作,在无限循环中,它将冻结页面并且不会加载任何内容。有谁知道这是什么原因?

例子在这里

<html>
<head>
    <script type='text/javascript'>
    var x = 0;

    function conslog() {
        var x = 0;
        while (1) {
            console.log(x);
            x++;
        }
    }

    function dowrite() {
        var x = 0;
        while (1) {
            document.write(x);
            x++;
        }
    }
    </script>
</head>
<body>
    <button type='button' onClick='conslog()'>console</button>
    <button type='button' onClick='dowrite()'>write</button>
</body>
</html>

http://shodor.org/~amalani/infinite.html

4

3 回答 3

3

记录消息的查看过程独立于脚本。当脚本在无限循环中运行时,有时渲染器会拦截它并显示排队的消息。

相反,当挂起的解析阻止脚本完成运行document.write时,写入将被解析的缓冲区。只是它没有完成……</p>

如果您使用 DOM 附加新元素,它们可能会输出。

于 2013-03-23T14:37:53.730 回答
2

当 Javascript 未执行时,页面将重新绘制,如果它正在运行循环,则页面不会重新绘制,因为 Javascript 仍在执行。页面上运行 Javascript 时,控制台可能会重新绘制。

于 2013-03-23T14:37:58.990 回答
0

很可能是因为 HTML 页面的大小没有有限的限制,但控制台调试日志会吗?我猜你的 CPU 负载也上升了,而浏览器实际上只是处理了一个循环。我猜这是使用某种形式的代码while (1) { console.log ("something") };

你还没有说明这是用什么浏览器,所以你可能会发现不同的浏览器有不同的控制台日志行为。那些将其实现为不断增长的列表或环形缓冲区的人也可能会遭受浏览器挂起的影响。

于 2013-03-23T14:36:14.103 回答