2010-07-13 2 views
3

По причинам, полностью вне моего понимания, эта функция работает просто отлично:Бесконечный цикл вызван отсутствием предупреждения()

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

Может кто поможет уточнить?

+1

Я действительно не понимаю смысла этой функции ... не могли бы вы объяснить немного больше, чтобы, возможно, мы могли найти другое решение? – oezi

+0

Ребята, большое вам спасибо за быстрый ответ. Я должен был догадаться, что у события не было возможности стрелять, и хорошо, что это подтверждено сообществом. @oezi - скрипт проверяет изображения, которые на самом деле существуют, останавливая счет сразу после запуска события 'onerror'. – Impirator

ответ

3

Я был бы очень осторожен, делая то, что вы делаете. Понимаете, вы, по сути, крутите бесконечный цикл, полагаясь на событие error, брошенное JS, чтобы прервать этот цикл. Я предполагаю, что вы видите вышеуказанное поведение, потому что вызов alert() - это перекачка сообщений и возможность запуска события. В последнем примере вы просто вращаете процессор, не давая ничего другого шанса.

3

В своем первом фрагменте, вызовите alert функции внутри цикла приводит к временной остановке, предположительно, давая время для error обратного вызова для выполнения, установив loop флаг false.

В вашем втором фрагменте, когда alert вызова не присутствует в while, цикл будет выполняться много раз, стрельбой из браузера long-running script warning.

+0

Это тоже правильно, я просто не могу назначить два правильных ответа. Спасибо, CMS. – Impirator

0

Не могу понять, почему, но похоже, что во втором случае по какой-то причине происходит смешение переменной области видимости.

0

В большинстве браузеров ничего не будет написано на странице до тех пор, пока пользователь явно не получит контроль (в вашем случае через предупреждение), или javascript достигнет естественного вывода. theerror() никогда не выполняется без предупреждения о приостановке цикла.

Можно ли написать цикл for, заданный длиной abc?

1

Javascript single-threaded and synchronic. Если вы удалите предупреждение, ваш цикл будет оставаться занятым, и ошибка не будет выбрана (она будет поставлена ​​в очередь, на самом деле), пока обработка не завершится. Предупреждение делает вашу бесконечную паузу паузы на некоторое время и позволяет Javascript обрабатывать события в очереди.

Смежные вопросы