Как остановить выполнение цикла javascript

допустим, я случайно это написал:
do { } while (true);
…а потом запустил его. Помимо убийства вашего браузера, есть ли способ остановить выполнение javascript (эквивалент Ctrl+Break в basic или Ctrl+C)?
обычно, примерно через 30 секунд ваш браузер спрашивает, Хотите ли вы остановить длительный скрипт, но это не всегда происходит (как я только что узнал)!
FYI: простой цикл, такой как этот:for (i=1; i > 0; ++i); приведет к сбою моего браузера (Firefox 3.5b4). Мне не очень хочется проверять, есть ли это какие-либо из моих дополнений. Непрерывный перезапуск моего браузера-это не моя идея веселой ночи понедельника.
11 ответов
по крайней мере, с Chrome вы можете убить отдельную вкладку, а не все приложение.
Randolpho также сообщил мне, что IE8 имеет аналогичную функциональность.
Я использую Chome версии 45.0.2454.101
в правом верхнем углу, в меню гамбургер, нажмите на другие инструменты > Диспетчер задач, а затем убить вкладку оттуда. Это если попытка закрыть вкладку не удается. В противном случае простой ” X ” на вкладке убивает его.
ref: https://superuser.com/questions/92617/stop-never-ending–alerts-in-firefox
Firefox особенно проблематичен …
предупреждение! Нюанс! Не запускайте это!
javascript: while (true) alert(“irritated and exhausted – yet?”);
это будет идти “бесконечно” и не исчерпает внутренний тайм-аут, так как скрипт не будет жевать время процессора достаточно быстро. В FF 11 это гарантирует, что не будет возможности аборта” невосприимчивого сценария”.
грациозно останавливая как раз оскорбительный сценарий был возможен и тривиален в ранних версиях браузера, используя ручное вмешательство, без карканья и прерывания всего браузера. Отсутствие такого контроля является основным недостатком дизайна программного обеспечения браузера. Неразумная ловкость и рефлекс необходимы для воздействия на механику ручного двигателя” решений”, описанных в справочнике.
предостережение: скрипты могут идти “бесконечно” без тайм-аута и без подсказок типа предупреждения. Они особенно пагубны и раздражающий. В принципе, скрипты работают достаточно медленно, так что временной цикл процессора составляет, скажем, 20 секунд. растягивается на несколько минут или часов или…, до тайм-аута, путем приостановки выполнения в ожидании возобновления на триггере события. Вместо синхронизации циклов процессора было бы намного лучше для сценариев тайм-аута в реальном мире. (Когда – нибудь замечали, как вы не можете прервать сценарий, который пытается получить контент – но безуспешно-для создания страницы? В FF как адресная строка пуговицы!–3–> и cancel/stop отключены, хотя вкладка по крайней мере может быть закрыта.) Обычный javascript out() и setInterval() звонки не страдают от этого и обусловлены таким образом, что в то время как приостановлено, ручное вмешательство можно прервать их “изящно”.
тестовая среда для эмпирических наблюдениях:
window.igator.userAgent= Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
PS. сценарий
for (i=1; i > 0; ++i);
в конечном итоге поймает ошибку переполнения, когда i превышает максимально допустимое значение.
обновить 2018:
в Chrome 67, если у вас открыты DevTools (F12), вы можете закончить бесконечный цикл, не убивая весь вкладка:
- перейти к источник панель и нажмите “приостановить выполнение скрипта”.
- удерживайте ту же кнопку и выберите “остановить” икона.
https://developers.google.com/web/ups/2018/04/devtools#stop
в большинстве браузеров есть предупреждение” медленная производительность скрипта”, которое появляется, когда неконтролируемый javascript занимает очень много времени. Это диалоговое окно предупреждения обычно дает возможность убить сценарий-нарушитель.
зависит от браузера. Когда вы нажимаете кнопку “стоп”, чтобы остановить выполнение JavaScript. Другие-нет.–1–>
Я предлагаю лучший способ-просто убить браузер или вкладку полностью.
Если вы используете Chrome, вы можете легко убить вкладка не отвечает.
когда вы видите бесконечный цикл JavaScript, выполните следующие действия:
1.Если вы уже открыли другую вкладку, перейдите на эту вкладку или откройте новый
2.Нажмите “Shift + Esc”, чтобы открыть Диспетчер задач Chrome
3.Найдите вкладку в списке (должна быть с наибольшим потребителем памяти в списке) и нажмите кнопку “Завершить процесс”.
переход к другая вкладка важна, потому что JavaScript поймает ваше нажатие клавиши и ничего не сделает из-за ее бесконечного цикла.
большинство приличных браузеров показывают предупреждение” невосприимчивый скрипт”… Если нет, я думаю, ваш лучший способ действий-выяснить, почему предупреждение не появляется.
Что я делаю при использовании Chrome, и это происходит, нажав shift + ctrl+esc, чтобы вызвать Windows taskmanager. Затем перейдите на вкладку Процессы и прокрутите chrome.exe-процессы (chrome имеет один процесс для каждой открытой вкладки), пока я не найду один со значительно более высоким использованием процессора, чем oters. Он имеет тенденцию иметь около 30% для меня, в то время как все остальные имеют как 0-2% Тогда я просто закончу этот процесс. На самом деле то же самое можно сделать, перейдя в tools>taskmanager или shift+esc в chrome, чтобы открыть его пользовательский taskmanager для его процессов. Может быть проще использовать это, так как он показывает больше информации о вкладках.
Если вы не хотите убивать вкладку или браузер, вот метод, который будет работать, если выполнены два условия (Chrome позволяет и другие браузеры, вероятно, тоже).
- браузер позволяет приостановить выполнение кода
- браузер позволяет изменять состояние переменной
объект состоит в том, чтобы приостановить код и изменить значение переменной, чтобы вызвать исключение.
автор: Dominique Fortin
Источник
massiv.forEach((item, i) { if (item == “1”) { console.log(i); return false; } });
Есть массив со значениями.
Внутри цикла есть условие поиска значения массива.
Задача: остановить дальнейший перебор цикла при первом найденном значении.
Спасибо за помощь.
Решение: (спасибо Lieutenant Jim Dangle)
[1, 2, 3, 4, 3].some((el,i) { if (el == 3) { console.log(i); return el; } });
задан 6 янв ’17 в 12:28
Менеджер ТипографииМенеджер Типографии
52522 золотых знака44 серебряных знака1111 бронзовых знаков
4
метод forEach не предусматривает возможности прервать обход коллекции.
Если нужно проверить наличие конкретного элемента удовлетворяющего условию, лучше использовать метод some
Если проверяются полностью объекты, можно использовать метод indexOf
Если нужно найти индекс элемента удовлетворяющего условию, то подойдет метод findIndex
Если очень хочется использовать именно forEach – можно поместить его в try..catch и кидать ошибку если элемент найден.
Вместо встроенных функций массива, можно также воспользоваться циклом for. В этом случае для прерывания цикла можно использовать выражение break
ответ дан 6 янв ’17 в 12:48
Grundy♦Grundy
72.6k77 золотых знаков6464 серебряных знака123123 бронзовых знака
3
В методе forEach не предусмотренa остановка как в лупе посредством брейк.
Использовать every заместо forEach. Когда будет false, все остановится.
Это самый правильный способ.
massiv.every((item, i) { if (item == “1”) { console.log(i); return false; } else { return true; } });
Grundy♦
72.6k77 золотых знаков6464 серебряных знака123123 бронзовых знака
ответ дан 6 янв ’17 в 12:32
L. VadimL. Vadim
3,36611 золотой знак77 серебряных знаков1818 бронзовых знаков
6
[1, 2, 3].some((el) { console.log(el); return el === 2; });
ответ дан 6 янв ’17 в 12:48
1
Mожно остановить loop посредством вызова несуществующей функции и перехвата ошибки:
var massiv = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] try { massiv.forEach((item, i, vvv) { console.log(item); if (item == “5”) { vvv(); } }); } catch (e) {}
ответ дан 6 янв ’17 в 12:43
C.Raf.TC.Raf.T
4,03411 золотой знак99 серебряных знаков2020 бронзовых знаков
2
Всё ещё ищете ответ? Посмотрите другие вопросы с метками javascript foreach или задайте свой вопрос.
Источник
Циклы – простой способ сделать какое-то действие несколько раз. Эта глава руководства JavaScript Guide познакомит вас с различными операторами доступными в JavaScript.
Вы можете представить цикл в виде компьютеризированной версии игры, где вы говорите кому-то сделать X шагов в одном направлении, затем Y шагов в другом; для примера, идея игры “Иди 5 шагов на восток” может быть выражена в виде цикла:
var step; for (step = 0; step < 5; step++) { console.log(‘Идём 1 шаг на восток’); }
Существует множество различных видов циклов, но все они по сути делают тоже самое: повторяют какое-либо действие несколько раз (не забывайте про нулевой раз повторения, отсчёт в массиве начинается с 0). Различные по строению циклы предлагают разные способы для определения начала и окончания цикла. Для различных задач программирования существуют свои операторы цикла, с помощью которых они решаются намного проще.
Операторы предназначенные для организации циклов в JavaScript:
- Цикл_for
- Цикл_do…while
- Цикл_while
- Метка_(label)
- break
- continue
- for…in
- for…of
Цикл for
Цикл for повторяет действия, пока не произойдёт какое-либо специальное событие завершения цикла. Оператор for в JavaScript аналогичен оператору for в Java и C. Объявление оператора for выглядит следующим образом:
for ([начало]; [условие]; [шаг]) выражения
При его выполнении происходит следующее:
- Выполняется выражение начало, если оно указано. Это выражение обычно инициализирует один или несколько счётчиков, но синтаксис позволяет выражению быть любой сложности. Также используется для объявления переменных.
- Выполняется условие. Если условие истинно, то выполняются выражения. Если оно ложно, цикл for прерывается. Если же условие полностью пропущено, то оно считается истинным.
- Выполняются выражения. Чтобы выполнить несколько выражений, используются блок-выражение { … } для группировки выражений.
- Обновляется шаг, если он есть, а затем управление возвращается к шагу 2.
Пример
В следующей функции есть цикл for, который считает количество выбранных жанров в списке прокрутки (элемент <select>, который позволяет выбрать несколько элементов). Цикл for объявляет переменную i и задаёт ей значение 0. Также он проверяет, что i меньше количества элементов в элементе <select>, выполняет оператор if и увеличивает i на один после каждого прохода цикла.
<form name=”selectForm”> <p> <label for=”musicTypes”>Выберите некоторые жанры музыки, а затем нажмите на кнопку ниже:</label> <select id=”musicTypes” name=”musicTypes” multiple=”multiple”> <option selected=”selected”>R&B</option> <option>Jazz</option> <option>Blues</option> <option>New Age</option> <option>Classical</option> <option>Opera</option> </select> </p> <p><input id=”btn” type=”button” value=”Как много выбрано?” /></p> </form> <script> howMany(selectObject) { var numberSelected = 0; for (var i = 0; i < selectObject.options.length; i++) { if (selectObject.options[i].selected) { numberSelected++; } } return numberSelected; } var btn = document.getElementById(“btn”); btn.addEventListener(“click”, (){ alert(‘Выбрано элементов: ‘ + howMany(document.selectForm.musicTypes)) }); </script>
Цикл do…while
Цикл do…while повторяется пока заданное условие истинно. Оператор do…while имеет вид:
do выражения while (условие);
выражения выполняются пока условие истинно. Чтобы использовать несколько выражений, используйте блок-выражение { … }, чтобы сгруппировать их. Если условие истинно, выражения выполнятся снова. В конце каждого прохода условие проверяется. Если условие ложно, выполнение приостанавливается и управление передаётся выражению после do…while.
Пример
В следующем примере, цикл do выполнится минимум 1 раз и запускается снова, пока i меньше 5.
do { i += 1; console.log(i); } while (i < 5);
Цикл while
Цикл while выполняет выражения пока условие истинно. Выглядит он так:
while (условие) выражения
Если условие становится ложным, выражения в цикле перестают выполняться и управление переходит к выражению после цикла.
Условие проверяется на истинность до того, как выполняются выражения в цикле. Если условие истинно, выполняются выражения, а затем условие проверяется снова. Если условие ложно, выполнение приостанавливается и управление переходит к выражению после while.
Чтобы использовать несколько выражений, используйте блок выражение { … }, чтобы сгруппировать их.
Пример 1
Следующий цикл while работает, пока n меньше трёх:
var n = 0; var x = 0; while (n < 3) { n++; x += n; }
С каждой итерацией, цикл увеличивает n и добавляет это значение к x. Поэтому, x и n получают следующие значения:
- После первого прохода: n = 1 и x = 1
- После второго: n = 2 и x = 3
- После третьего прохода: n = 3 и x = 6
После третьего прохода, условие n < 3 становится ложным, поэтому цикл прерывается.
Пример 2
Избегайте бесконечных циклов. Убедитесь, что условие цикла в итоге станет ложным; иначе, цикл никогда не прервётся. Выражения в следующем цикле while будут выполняться вечно, т.к. условие никогда не станет ложным:
while (true) { console.log(“Hello, world”); }
Метка (label)
Метка представляет собой оператор с идентификатором, который позволяет вам ссылаться на какое-то место в вашей программе. Например, вы можете использовать метку, чтобы обозначить цикл, а затем использовать операторы break или continue, чтобы указать, должна ли программа прерывать цикл или продолжать его выполнение.
Синтаксис метки следующий:
метка : оператор
Значение метки может быть любым корректным JavaScript идентификатором, не являющимся зарезервированным словом. Оператор, указанный вами после метки может быть любым выражением.
Пример
В этом примере, метка markLoop обозначает цикл while.
markLoop: while (theMark == true) { doSomething(); }
break
Используйте оператор break, чтобы прерывать цикл, переключать управление или в сочетании с оператором метка.
- Когда вы используете break без метки, он прерывает циклы while, do-while и for или сразу переключает управление к следующему выражению.
- Когда вы используете break с меткой, он прерывает специально отмеченное выражение.
Синтаксис оператора может быть таким:
- break;
- break Метка;
Первая форма синтаксиса прерывает цикл совсем или переключает управление; вторая прерывает специально обозначенное выражение.
Пример 1
Следующий пример проходит по элементам в массиве, пока не найдёт элемент, чьё значение – theValue:
for (i = 0; i < a.length; i++) { if (a[i] == theValue) { break; } }
Пример 2: Прерывание метки
var x = 0; var z = 0 labelCancelLoops: while (true) { console.log(“Внешний цикл: ” + x); x += 1; z = 1; while (true) { console.log(“Внутренний цикл: ” + z); z += 1; if (z === 10 && x === 10) { break labelCancelLoops; } else if (z === 10) { break; } } }
continue
Оператор continue используется, чтобы шагнуть на шаг вперёд в циклах while, do-while, for или перейти к метке.
- Когда вы используете continue без метки, он прерывает текущую итерацию циклов while, do-while и for и продолжает выполнение цикла со следующей итерации. В отличие от break, continue не прерывает выполнение цикла полностью. В цикле while он прыгает к условию. А в for увеличивает шаг.
- Когда вы используете continue с меткой, он применяется к циклу с этой меткой.
Синтаксис continue может выглядеть так:
- continue;
- continue Метка;
Пример 1
Следующий пример показывает цикл while с оператором continue, который срабатывает, когда значение i равно 3. Таким образом, n получает значения 1, 3, 7 и 12.
var i = 0; var n = 0; while (i < 5) { i++; if (i == 3) { continue; } n += i; }
Пример 2
Выражение, отмеченное checkiandj содержит выражение отмеченное checkj. При встрече с continue, программа прерывает текущую итерацию checkj и начинает следующую итерацию. Каждый раз при встрече с continue, checkj переходит на следующую итерацию, пока условие возвращает false. Когда возвращается false, после вычисления остатка от деления checkiandj, checkiandj переходит на следующую итерацию, пока его условие возвращает false. Когда возвращается false, программа продолжает выполнение с выражения после checkiandj.
Если у continue проставлена метка checkiandj, программа может продолжиться с начала метки checkiandj.
checkiandj: while (i < 4) { console.log(i); i += 1; checkj: while (j > 4) { console.log(j); j -= 1; if ((j % 2) != 0) { continue checkj; } console.log(j + ” чётное.”); } console.log(“i = ” + i); console.log(“j = ” + j); }
for…in
Оператор for…in проходит по всем перечислимым свойствам объекта. JavaScript выполнит указанные выражения для каждого отдельного свойства. Цикл for…in выглядит так:
for (variable in object) { выражения }
Пример
Следующая функция берёт своим аргументом объект и его имя. Затем проходит по всем свойствам объекта и возвращает строку, которая содержит имена свойств и их значения.
dump_props(obj, obj_name) { var result = “”; for (var i in obj) { result += obj_name + “.” + i + ” = ” + obj[i] + “<br>”; } result += “<hr>”; return result; }
Для объекта car со свойствами make и model, результатом будет:
car.make = Ford car.model = Mustang
Пример №2
Также, по ключу можно выводить значение:
let obj = {model: ‘AUDI A8’, year: ‘2019’, color: ‘brown’} for (key in obj) { console.log(`${key} = ${obj[key]}`); } // model = AUDI A8 // year = 2019 // color = brown
Массивы
Хотя, очень заманчиво использовать for…in как способ пройтись по всем элементам Array, этот оператор возвращает имя свойств определённых пользователем помимо числовых индексов. Таким образом лучше использовать стандартный for для числовых индексов при взаимодействии с массивами, поскольку оператор for…in проходит по определённым пользователем свойствам в дополнение к элементам массива, если вы изменяете массив, например, добавляете свойства и методы.
Пример
let arr = [‘AUDI A8’, ‘2019’, ‘brown’]; arr.cost = ‘$100.000’; for (key in arr) { console.log(`${key} = ${arr[key]}`); } // 0 = AUDI A8 // 1 = 2019 // 2 = brown // cost = $100.000
for…of
Оператор for…of создаёт цикл, проходящий по перечислимым объектам (en-US) (включая Array, Map, Set, объект arguments (en-US) и так далее), вызывая на каждой итерации функцию с выражениями, которые надо выполнить для получения значения каждого отдельного свойства.
for (variable of object) { выражения }
Следующий пример показывает разницу между циклами for…of и for…in. Тогда как for…in проходит по именам свойств, for…of проходит по значениям свойств:
let arr = [3, 5, 7]; arr.foo = “hello”; for (let i in arr) { console.log(i); } for (let i of arr) { console.log(i); }
- « Предыдущая статья
- Следующая статья »
Источник