Как вы останавливаете бесконечный цикл в Javascript?

Допустим, я случайно написал это:

 do { } while (true);

... а затем запустил его. Помимо убийства вашего браузера, есть ли способ остановить выполнение javascript (эквивалент Ctrl + Break в основном или Ctrl + C)?

Обычно, примерно через 30 секунд ваш браузер спрашивает, хотите ли вы остановить длительный скрипт, но это не всегда происходит (как я только что узнал)!

К вашему сведению: простой цикл такой:for (i=1; i > 0; ++i); вызовет сбой моего браузера (Firefox 3.5b4). Мне не очень нравится тестировать, чтобы увидеть, есть ли какие-нибудь из моих дополнений. Постоянно перезапускать мой браузер - не моя идея веселого вечера понедельника.

 Chetan24 апр. 2011 г., 22:45
О, я неправильно понял это как вопрос об использовании браузера, а не о разработке плагинов. Виноват.
 Chetan24 апр. 2011 г., 21:42
Это относится к SuperUser?
 nickf25 мая 2009 г., 06:59
без понятия! (это ограничение в 15 символов раздражает)
 alex25 мая 2009 г., 06:47
Из любопытства вы смогли определить, что заставило ваш браузер не выдавать предупреждение «медленный сценарий»?
 nickf24 апр. 2011 г., 22:03
@Chetan: Это в значительной степени связано с программированием ...

Ответы на вопрос(10)

В Chrome 67, если у вас открыт DevTools (F12), вы можете завершить бесконечный цикл, не уничтожая всю вкладку:

Перейти кисточники и нажмите «Приостановить выполнение скрипта».Удерживайте эту же кнопку и выберите значок «Стоп».

https://developers.google.com/web/updates/2018/04/devtools#stop

https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox#comment93927_92617, поанонимный:

Это не является удовлетворительным решением общего назначения, но с помощью Greasmonkey (или, возможно, Ubiquity или Jetpack) вы можете перезаписать window.alert с помощью функции, которая вызывает window.confirm и, по желанию, выдает ошибку, останавливая выполнение всех скриптов или переключает флаг, чтобы остановить оповещения. Это может быть полезно, если сайт, на который вы продолжаете возвращаться, представляет такое поведение.

В верхнем правом углу, в меню гамбургера, нажмите Дополнительные инструменты> Диспетчер задач, а затем убейте вкладку оттуда. Это если попытка закрыть вкладку не удалась. В противном случае простое «X» на вкладке убивает его.

 masterX24423 февр. 2017 г., 09:37
наличие бесконечного цикла в обратном вызове Ajax приводит к сбою простого X, когда у вас открыт devtools.
Решение Вопроса

в Chrome вы можете убить отдельную вкладку, а не целое приложение.

Randolpho также сообщил мне, что IE8 имеет аналогичную функциональность.

 mellamokb26 апр. 2011 г., 03:30
Можете ли вы рассказать, как убить одну вкладку? Ищем ли мы нужный chrome.exe и убиваем его в диспетчере задач?
 Michael Scheper04 мар. 2015 г., 05:24
У меня это работало, в версии 40.0.2214.115 (64-битная версия), но мне пришлось ждать несколько секунд. Этот ответ был бы в 10 раз полезнее и имел бы право голоса, если бы он включал эти детали.
 Salman Abbas23 июл. 2011 г., 02:03
Нажмите Shift + Esc
 Octopus11 окт. 2014 г., 06:56
отрицательный, не работает! по крайней мере, не в версии 36.0.1985.125 для Linux
 Barak Gall07 июл. 2016 г., 00:29
Я обнаружил, что это сработало для меня, однако, если вы нажмете Shift + Esc на той же вкладке, где есть бесконечный цикл, Chrome даст javascript шанс обработать нажатие клавиши / keydown / keyup, прежде чем решить, следует ли ему что-либо делать, поскольку ваш javascript занят и не может обработать события, которые вы в действительности отключаете все ярлыки Chrome.

https://superuser.com/questions/92617/stop-never-ending-popup-alerts-in-firefox
Firefox особенно проблематичен ...

Предупреждение! Предостережение! НЕ запускайте это!

javascript:
    while (true) alert("irritated and exhausted - yet?");

Это будет «бесконечным» и НЕ исчерпает внутреннее время ожидания, так как скрипт не будет достаточно быстро загружать процессорное время. В FF 11 это гарантирует, что не будет возможности прерывания "не отвечающего сценария".

В ранних версиях браузера было возможно и просто изящно остановить только оскорбительный скрипт, используя ручное вмешательство, без квакации и прерывания всего браузера. Отсутствие такого контроля является основным недостатком дизайна программного обеспечения браузера. Необоснованная ловкость и рефлекс требуются, чтобы влиять на механику двигателя вручную из "решений", описанных в ссылке.

Предостережение: для сценариев возможно «бесконечное» время без тайм-аута и без подсказок типа оповещения. Это особенно пагубно и раздражает. В основном, сценарии выполняются достаточно медленно, поэтому время цикла ЦП, скажем, 20 секунд. растягивается на несколько минут или часов или ... до истечения времени ожидания путем приостановки выполнения в ожидании возобновления при срабатывании события. Вместо того, чтобы синхронизировать циклы ЦП, для сценариев было бы гораздо лучше использовать тайм-ауты в реальном времени. (Когда-нибудь замечали, как вы не можете прервать сценарий, который пытается получить контент - но безуспешно - для создания страницы? В FF обе кнопки адресной строкиreload а такжеcancel/stop отключены, хотя вкладка, по крайней мере, может быть закрыта.) Нормальный JavaScriptTimeout() а такжеsetInterval() вызовы не страдают от этого и обусловлены тем, что при приостановке ручное вмешательство позволяет прервать их «изящно».

Тестовая среда для эмпирических наблюдений:

window.navigator.userAgent=
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0

PS. сценарий

for (i=1; i > 0; ++i);

будет в конечном итоге ловушку при ошибке переполнения, когдаi превышает максимально допустимое значение.

когда использую Chrome, и это происходит, нажимая клавиши shift + ctrl + esc, чтобы вызвать диспетчер задач Windows. Затем переключитесь на вкладку процессов и прокрутите процессы chrome.exe (в chrome есть по одному процессу для каждой открытой вкладки), пока я не найду процесс со значительно более высоким использованием ЦП, чем другие. У меня, как правило, около 30%, в то время как у остальных - около 0-2%. Тогда я просто закончу этот процесс. На самом деле то же самое можно сделать, перейдя в инструменты> TaskManager или Shift + Esc в Chrome, чтобы открыть его собственный диспетчер задач для своих процессов. Это может быть проще в использовании, так как он показывает больше информации о вкладках.

ьность скрипта», которое возникает, когда неуправляемый JavaScript занимает очень много времени для выполнения. Это диалоговое окно с предупреждением обычно дает возможность уничтожить нарушающий сценарий.

 user6600112 авг. 2013 г., 00:00
См. Stackoverflow.com/questions/905322/… для возможной причины, по которой «диалоговое окно не всегда отображается».
 mellamokb26 апр. 2011 г., 03:28
-1 избыточный. ОП: «Обычно через 30 секунд ваш браузер спрашивает, хотите ли вы остановить длительный скрипт, но это не всегда происходит (как я только что узнал)!» Я также столкнулся с той же проблемой, когда диалог не всегда появлялся.

чает сценарий» ... Если нет, то я думаю, что вам лучше всего выяснить, почему предупреждение не появляется.

вы можете легко убить не отвечающую вкладку.

Когда вы видите бесконечный цикл JavaScript, выполните следующие шаги:

1.Если вы уже открыли другую вкладку, перейдите на эту вкладку или откройте новую

2. Нажмите «Shift + Esc», чтобы открыть диспетчер задач Chrome.

3.Найдите вкладку в списке (должно быть с наибольшим потребителем памяти в списке) и нажмите кнопку «Завершить процесс».

Переход на другую вкладку важен, потому что JavaScript поймает нажатие вашей клавиши и не будет ничего с этим делать из-за бесконечного цикла.

чтобы остановить выполнение JavaScript. Другие нет.

Я предлагаю лучший способ - просто полностью убить браузер или вкладку.

Ваш ответ на вопрос