由于完全超出我理解的原因,这个功能运行得很好:
function foo() {
var loop = true;
var abc = ["a","b","c"];
var ctr = 0;
while(loop) {
$("<img />").error(function () {
loop = false;
}).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg");
alert(ctr);
}
}
但将alert(ctr)
移到while
之外会触发无限循环。
function foo2() {
var loop = true;
var abc = ["a","b","c"];
var ctr = 0;
while(loop) {
$("<img />").error(function () {
loop = false;
}).attr('src','images/letters/'+abc[1]+(ctr++)+".jpg");
}
alert(ctr);
}
任何人都可以帮忙澄清一下吗?
答案 0 :(得分:3)
在你的第一个片段中,循环内的alert
函数调用导致暂时停止它,可能会给error
回调执行时间,将loop
标志设置为{{ 1}}。
在您的第二个代码段中,当false
中没有alert
来电时,循环将执行多次,触发浏览器的long-running script warning。
答案 1 :(得分:3)
我会非常警惕做你正在做的事情。你看,你实际上是在旋转一个无限循环,依赖于JS抛出的error
事件来中断该循环。我想你正在看到上述行为,因为调用alert()
正在抽取消息,并为事件提供机会。在后一个示例中,您只是在旋转CPU,而不是给其他任何机会发生。
答案 2 :(得分:1)
Javascript是单线程和同步的。如果您删除警报,您的循环将保持繁忙,并且不会抛出错误(实际上将排队),直到处理完成。警报会使您的无限循环暂停一段时间,并让Javascript处理排队的事件。
答案 3 :(得分:0)
看不出原因,但似乎在第二种情况下由于某种原因存在可变范围的混淆。
答案 4 :(得分:0)
在大多数浏览器中,除非明确给予用户控制权(在您的情况下通过警报)或javascript达到自然结论,否则不会向页面写入任何内容。如果没有警报来暂停循环,则永远不会生成.error()。
考虑到abc的长度,是否可以写一个for循环?