为什么这个for循环不起作用?

时间:2014-02-20 20:44:51

标签: javascript html for-loop

为什么这些代码在我不在for循环中使用var theLength时会崩溃?为什么我需要将x.length分配给var theLength并在for循环中使用它以使其工作?谢谢, *我的问题没有错,请暂停我的问题。有人正在努力学习。

  <html>
        <head>
            <script>
                window.onload= test;

                function test(){
                    var x=document.getElementsByTagName('*');
                    var theLength=x.length;
                    for(var i=0; i<x.length; i++){ // this i<x.length won't work
                                                 // But it will work with i<theLength
                        document.write("Hello World!<br>");
                    }
                }
            </script>
        </head>
        <body>  
        </body>
    </html>

4 个答案:

答案 0 :(得分:3)

这两种情况都有效。但是当你指定

var theLength=x.length;

整个循环都是常数。在每个文档写入后使用x.length时,值增加1。所以循环是无止境的。

答案 1 :(得分:2)

举个例子:

x = document.getElementsByTagName('*'); // x.length = 5
theLength = x.length; // theLength = 5

for(var i = 0; i < x.length; i++) {

    document.write('hello');

    // after the first write(), x.length = 1
    // JavaScript is now confused of the new x.length value
}

发生错误是因为您要通过写入文档来更改x.length的值。 x的值每次都会不断变化,JavaScript足够聪明,可以检测和禁止。

它与theLength = x.length一起使用,因为theLength是常量。

答案 2 :(得分:1)

它不起作用,因为当你在for循环中有x.length时 - 随着你不断添加新的dom元素,它的值会不断增加。在“theLength”变量中设置for循环之前的值时,它的固定值为4.

所以这绝对不是一回事。如果你在for循环中记录x.length的值,你会看到它的值随循环的每次迭代而增加 - 所以你创建了一个无限循环!

        window.onload= test;

        function test(){
            var x=document.getElementsByTagName('*');
            var theLength=x.length;
            for(var i=0; i<x.length; i++){
                console.log(" x.length: " + x.length);                    
                document.write("Hello World!<br>");
            }
        }

答案 3 :(得分:0)

这是因为通过将<br>标记写入文档,您将添加新标记。所以x在你进入循环时长度增加,因此是一个无限循环。

您可以在控制台中尝试:

var x=document.getElementsByTagName('*');
x.length
document.write("Hello World!<br>")
x.length // will increase
document.write("Hello World!")
x.length // will stay the same

在您进入循环之前指定var theLength = x.length,无论您是否添加其他标记,theLength都保持不变。因此行为上的差异。