为什么这个while循环会冻结我的页面?

时间:2011-08-30 19:12:00

标签: javascript

var f = 5, d;

while (f === 5) d = 2;

alert(d);

为什么这会冻结我的页面。我想只有当页面在while循环中执行document.write,alert或console.log时(没有带限制的递增值)它才会冻结页面,但不会使用变量...我还需要有一个var i = 0; while (i < 5 &&...只是为了让它发挥作用?

编辑:我在google的源代码中找到了这个。这个while循环没有数字限制,但它不会冻结页面:

while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode;

7 个答案:

答案 0 :(得分:2)

因为f === 5是真的,你永远不会改变f(在你的循环中),所以你的循环永远不会停止。

您的循环会重复设置d = 2,但这不会改变f。所以你的循环会尽可能快地设置d。就好像你做了while(true) {...}

答案 1 :(得分:2)

页面只有一个帖子。如果你的javascript永远不会结束,它永远不会让任何其他东西使用该线程。

编辑:回答您编辑过的问题:

while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode;

这里的重要部分是a = a.parentNode。循环的每次迭代都将具有a的不同值。它基本上是遍历DOM。它将继续遍历DOM树,直到a没有父项或者找到具有eid属性的元素。

答案 2 :(得分:2)

您将f设置为5

然后,只要f5,就可以将d设置为2

这将永远持续下去,因为f永远是5。您不需要更改f

答案 3 :(得分:2)

您编辑到问题中的Google循环是在while条件下测试a的值,并且它正在修改循环内a的值,因此循环将在{{1}时终止(或基于a的其他条件之一)不再是真实的。

a

对于要终止的循环,您在循环条件中测试的某些值必须在循环迭代期间的某个时间更改为falsey值。它不一定是数字,也可能是其他对它们有讽刺或虚假概念的东西。

在Google循环中,有两个条件可以使其终止:

  1. while (a && !(a.getAttribute && (b = a.getAttribute("eid")))) a = a.parentNode; 不再是真实的(null,undefined,0,false等等。)。
  2. a.getAttribute(“eid”)存在。
  3. 所以,基本上这是在父链上寻找具有getAttribute(“eid”)的第一个父级。当它用完父母检查或者找到具有该属性的父母时,它会停止。

答案 4 :(得分:0)

这是一个无限循环 - 循环永不退出!你需要做一些事情来使循环条件终止,这是习惯做法:

$counter = 0;
while ($counter++ < 10) {
    // do something
}
alert('loop is finished!');

至于:     while(a&amp;&amp;!(a.getAttribute&amp;&amp;(b = a.getAttribute(“eid”))))a = a.parentNode;

变量a在循环内部发生变化 - 始终向上移动父节点,直到它用完父元素。所以最终循环终止了。你的代码不是这样。

答案 5 :(得分:0)

因为while表达式总是求值为true,所以它会尝试执行循环并且永不停止,因为f永远不会改变。

答案 6 :(得分:0)

只是因为当任何 Javascript代码正在执行时,页面总是被“冻结”。你听说过document.write是不正确的。 Javascript在单个线程中运行,只要Javascript线程正常工作,所有当前浏览器都会阻止用户与页面的交互。

您添加的Google代码段会修改变量a。假设parentNode属性最终返回null或另一个假值,循环将终止。