为什么console.log在溢出之前运行无限循环,而document.write则不运行

时间:2013-03-23 14:32:17

标签: javascript console

在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

3 个答案:

答案 0 :(得分:3)

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

相反,document.write会写入一个缓冲区,该缓冲区将在pending parsing-blocking script完成运行时进行解析。只有它没有完成......

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

您没有说明这是什么浏览器,因此您可能会发现不同的浏览器具有不同的控制台日志行为。将它作为增长列表或环形缓冲区实现的那些也可能会使浏览器挂起。