为什么在循环冻结我的页面时会这样做
Why does this while loop freeze my page?
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 值。 它不一定是数字,它可以是其他对他们有真或假概念的东西。
在谷歌循环中,有两个条件可以使它终止:
-
a
不再是真(空,未定义,0,假等(。 - 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 值,循环将终止。
- 页面在我的javascript执行后重新加载,我不希望它这样做
- 如果我不这样做会发生什么;t在javascript中的变量中分配新的Image
- 如果他们不这样做,就从我的数组中删除东西't没有前缀
- 我刚刚开始使用 MEAN 堆栈.我试图将我的表单提交数据存储到 mongo 数据库,但我无法这样做
- 嵌套的 if/else 语句讨论了分配变量.我已经这样做了,但它仍然不起作用
- 当用户离开我的网站时,将标题附加到页面(他们也会这样做)
- 谷歌地图API v.3-无法显示信息窗口,或者当我这样做时,地图的中心位于设计位置
- 如果我不这样做,服务器有什么好的技巧来处理更多的请求吗;不必发回任何数据
- 为什么链接在我的Rails应用程序这样做
- 可以一个jQuery ajaxSuccess函数通知在另一个(javascript)文件的AJAX事件?如果是这样,我做
- 我是否过度使用Knockout映射插件总是使用它来做我的视图模型
- 告诉我为什么我不应该这样做:全JS/HTML前端的Sinatra API
- 如何在JavaScript中从较大的字符串中删除一些字符串,当我不这样做的时候'我不知道他们的立场
- 为什么在循环冻结我的页面时会这样做
- JSON中的Web Api数据被包装在一个对象中,为什么会这样,我如何告诉Web Api所有者该怎么做来解决这个问题
- reactjs/redux -我这样做对吗?很少有关于代码的问题
- 为什么获胜't我的javascript按钮像它们一样重定向'我们应该这样做
- 我正在尝试在xPage的一个按钮中调试一些Javascript.有没有办法这样做
- 一个网站我'我试图使用JavaScript取代我的setTimeout函数与点.为什么它会这样做,我该如何解决它
- 为什么我不做我的grunt任务工作- emailBuilder