Javascript 由缺少警报()触发的无限循环

Javascript 由缺少警报()触发的无限循环,javascript,jquery,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++

出于完全超出我理解的原因,此函数运行良好:

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

有人能帮你澄清一下吗?

在你的第一个代码片段中,循环中的
警报
函数调用会导致它暂时停止,可能会给
错误
回调留出执行时间,将
循环
标志设置为


在您的第二个代码段中,当
警报
调用不在
while
中时,循环将执行多次,触发浏览器的。

看不出原因,但在第二种情况下,似乎由于某种原因,变量作用域出现了混淆。

我会非常小心您所做的事情。你看,你本质上是在旋转一个无限循环,依靠JS抛出的
错误
事件来中断这个循环。我猜想您看到了上述行为,因为调用
alert()
是在传递消息,并给事件一个触发的机会。在后一个例子中,您只是在旋转CPU,没有给任何其他事情机会发生。

在大多数浏览器中,在用户明确获得控制权(在您的情况下是通过警报)或javascript达到自然结论之前,不会向页面写入任何内容。如果没有暂停循环的警报,则永远不会生成.error()


考虑到abc的长度,是否可以编写for循环?

Javascript是单线程和同步的。如果删除警报,则循环将使其保持忙碌状态,并且在处理完成之前不会抛出错误(实际上它将排队)。该警报会使无限循环暂停一段时间,并让Javascript处理排队事件。

我真的不明白该函数的意义。。。请你再解释一下,也许我们可以找到另一个解决方案。伙计们,非常感谢你们的及时回复。我应该猜到这项活动没有机会举行,很高兴得到社区的肯定@oezi-脚本通过在触发
onerror
事件后停止计数来检查实际存在的图像。这也是正确的,我只是无法分配两个正确答案。谢谢,CMS。
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);
}