没有alert()触发的无限循环

时间:2010-07-13 05:01:53

标签: javascript jquery

由于完全超出我理解的原因,这个功能运行得很好:

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);
}

任何人都可以帮忙澄清一下吗?

5 个答案:

答案 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循环?