为什么在循环冻结我的页面时会这样做

Why does this while loop freeze my page?

本文关键字:这样做 我的 循环 冻结 为什么      更新时间:2023-09-26
var f = 5, d;
while (f === 5) d = 2;
alert(d);

为什么这会冻结我的页面。我认为只有当页面在 while 循环中执行 document.write、警报或控制台.log时(没有带限制的增量值(它会冻结页面,但不会冻结变量......我还需要有一个var i = 0; while (i < 5 &&...才能让它工作吗?

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

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

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

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

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

在谷歌循环中,有两个条件可以使它终止:

  1. a不再是真(空,未定义,0,假等(。
  2. a.getAttribute("eid"( 存在。

所以,基本上这是在父链上寻找第一个具有getAttribute("eid"(的父链。 当它用完要检查的父项或找到具有该属性的父项时,它会停止。

因为f === 5是正确的,并且您永远不会更改f(在您的循环内(,因此您的循环永远不会停止。

您的循环确实会反复设置d = 2,但这不会改变f。 因此,您的循环会尽可能快地不断设置d。 就好像你while(true) {...}.

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

编辑:

要回答您编辑的问题:

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

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

您将f设置为 5

然后,只要f 5,您就可以将d设置为 2

这将永远持续下去,因为f将永远5.您不会更改f.

这是一个无限循环 - 循环永远不会退出!你需要做一些事情来使循环条件终止,像这样的事情是惯例:

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

至于: 而(a && !(a.getAttribute && (b = a.getAttribute("eid"(((( a = a.parentNode;

变量a在循环中发生变化 - 始终向上移动父节点,直到父元素用完。所以最终循环终止。在您的代码中并非如此。

由于while表达式的计算结果始终为 true,因此它会尝试执行循环并且永远不会停止,因为f永远不会更改。

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

您包含的谷歌代码片段修改了变量a。假设 parentNode 属性最终返回 null 或其他 falsy 值,循环将终止。

相关文章: