Циклы и итерации
Циклы — простой способ сделать какое-то действие несколько раз. Эта глава руководства JavaScript Guide познакомит вас с различными операторами доступными в JavaScript.
Вы можете представить цикл в виде компьютеризированной версии игры, где вы говорите кому-то сделать X шагов в одном направлении, затем Y шагов в другом; для примера, идея игры «Иди 5 шагов на восток» может быть выражена в виде цикла:
var step; for (step = 0; step 5; step++) // Запускается 5 раз, с шагом от 0 до 4. console.log("Идём 1 шаг на восток"); >
Существует множество различных видов циклов, но все они по сути делают тоже самое: повторяют какое-либо действие несколько раз (не забывайте про нулевой раз повторения, отсчёт в массиве начинается с 0). Различные по строению циклы предлагают разные способы для определения начала и окончания цикла. Для различных задач программирования существуют свои операторы цикла, с помощью которых они решаются намного проще.
Операторы предназначенные для организации циклов в JavaScript:
Цикл for
Цикл for повторяет действия, пока не произойдёт какое-либо специальное событие завершения цикла. Оператор for в JavaScript аналогичен оператору for в Java и C. Объявление оператора for выглядит следующим образом:
for ([начало]; [условие]; [шаг]) выражения
При его выполнении происходит следующее:
- Выполняется выражение начало , если оно указано. Это выражение обычно инициализирует один или несколько счётчиков, но синтаксис позволяет выражению быть любой сложности. Также используется для объявления переменных.
- Выполняется условие . Если условие истинно, то выполняются выражения . Если оно ложно, цикл for прерывается. Если же условие полностью пропущено, то оно считается истинным.
- Выполняются выражения . Чтобы выполнить несколько выражений, используются блок-выражение < . >для группировки выражений.
- Обновляется шаг , если он есть, а затем управление возвращается к шагу 2.
Пример
form name="selectForm"> p> label for="musicTypes" >Выберите некоторые жанры музыки, а затем нажмите на кнопку ниже:label > select id="musicTypes" name="musicTypes" multiple="multiple"> option selected="selected">R&Boption> option>Jazzoption> option>Bluesoption> option>New Ageoption> option>Classicaloption> option>Operaoption> select> p> p>input id="btn" type="button" value="Как много выбрано?" />p> form> script> function 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", function () 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
Пример 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 с меткой, он прерывает специально отмеченное выражение.
Синтаксис оператора может быть таким:
Первая форма синтаксиса прерывает цикл совсем или переключает управление; вторая прерывает специально обозначенное выражение.
Пример 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 token operator">+ i); console.log("j token operator">+ j); >
for. in
Оператор for. in проходит по всем перечислимым свойствам объекта. JavaScript выполнит указанные выражения для каждого отдельного свойства. Цикл for. in выглядит так:
for (variable in object)
Пример
Следующая функция берёт своим аргументом объект и его имя. Затем проходит по всем свойствам объекта и возвращает строку, которая содержит имена свойств и их значения.
function dump_props(obj, obj_name) var result = ""; for (var i in obj) result += obj_name + "." + i + " token operator">+ obj[i] + "
"; > result += "
"; return result; >
Для объекта car со свойствами make и model , результатом будет:
.make = Ford; car.model = Mustang;
Пример №2
Также, по ключу можно выводить значение:
let obj = for (key in obj) < console.log(`$= $`); > // 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(`$= $`); > // 0 = AUDI A8 // 1 = 2019 // 2 = brown // cost = $100.000
for. of
Оператор for. of создаёт цикл, проходящий по перечислимым объектам (en-US) (включая Array , Map (en-US), 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); // выводит "0", "1", "2", "foo" > for (let i of arr) console.log(i); // выводит "3", "5", "7" >
- « Предыдущая статья
- Следующая статья »
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Операторы цикла For и While. Операторы Break и Continue
Операторы цикла выполняют блок кода заданное число раз, либо до тех пор, пока не выполнится заданное условие.
Циклы особенно удобны, когда нужно выполнять один и тот же код много раз, каждый раз с разным значением.
Часто операторы цикла используются при работе с массивами.
Так, вместо того чтобы писать:
text += cars[0] + "
"; text += cars[1] + "
"; text += cars[2] + "
"; text += cars[3] + "
"; text += cars[4] + "
"; text += cars[5] + "
";
var i; for (i = 0; i < cars.length; i++) < text += cars[i] + "
"; >
Различные виды операторов цикла
JavaScript поддерживает различные виды циклов:
- for – в цикле выполняет блок кода заданное число раз
- for/in – цикл по свойствам объекта
- while – выполняет блок кода до тех пор, пока заданное условие не будет равно true
- do/while – также выполняет блок кода до тех пор, пока заданное условие не будет равно true
Оператор цикла for
Оператор for это наиболее часто используемый инструмент для создания цикла.
Оператор цикла for имеет следующий синтаксис:
for (выражение 1; выражение 2; выражение 3) выполняемый блок кода
>
Выражение 1 выполняется до начала цикла (до начала выполнения блока кода).
Выражение 2 определяет условие продолжения цикла.
Выражение 3 выполняется после каждого прохода цикла.
Пример:
for (i = 0; i < 5; i++) < text += "Число: " + i + "
"; >
Код этого примера можно прочитать следующим образом:
- выражение 1 до начала цикла инициализирует переменную-счетчик (var i = 0).
- выражение 2 определяет условие продолжения цикла (i должно быть меньше 5).
- выражение 3 после каждого прохода цикла увеличивает на 1 счетчик (i++).
Выражение 1
Обычно, выражение 1 используется для инициализации переменной, которая будет использоваться внутри цикла, как правило в качестве счетчика (i = 0).
При этом выражение 1 является необязательным.
Можно в выражении 1 инициализировать несколько переменных (разделяя их запятыми):
for (i = 0, len = cars.length, text = ""; i < len; i++) < text += cars[i] + "
"; >
Можно пропустить выражение 1 (и определить все необходимые значения до самого цикла):
var i = 2; var len = cars.length; var text = ""; for (; i < len; i++) < text += cars[i] + "
"; >
Выражение 2
Часто выражение 2 используется для вычисления состояния переменной-счетчика.
При этом выражение 2 также является необязательным.
Если выражение 2 возвращает true, то начнется новый цикл. Если оно вернет false, то цикл закончится.
Внимание! Если выражение 2 не определяется, то внутри цикла должен быть задан оператор break. Иначе цикл никогда не закончится, что приведет к краху браузера.
Выражение 3
Обычно, в выражении 3 изменяется значение переменной-счетчика.
При этом выражение 3 также является необязательным.
Выражение 3 может выполнять любые действия, например, уменьшение (i—), увеличение (i = i + 15) и т.д.
Выражение 3 может быть пропущено (например, если вычисления с переменной-счетчиком осуществляются внутри цикла):
var i = 0; var len = cars.length; for (; i < len; ) < text += cars[i] + "
"; i++; >
Оператор цикла for/in
Оператор for/in используется для обхода в цикле свойств объекта:
var person = ; var text = ""; var x; for (x in person)
Оператор цикла while
Оператор while в цикле выполняет блок кода до тех пор, пока заданное условие равно true.
while (условие) выполняемый блок кода
>
В следующем примере код цикла будет выполняться снова и снова, пока значение переменной (i) будет меньше 10:
while (i
Внимание! Если вы забудете увеличить переменную, указанную в условии, то цикл никогда не закончится. Это приведет к краху браузера.
Оператор цикла do/while
Цикл do/while является вариантом цикла while. Этот цикл один раз выполнит блок кода перед проверкой условия завершения и затем будет повторять цикл до тех пор, пока условие не будет равно true.
do выполняемый блок кода
>
while (условие);
В следующем примере используется оператор цикла do/while. Такой цикл будет всегда выполняться по меньшей мере один раз, даже если условие равно false, потому что блок кода выполняется до проверки условия:
do < text += "Число: " + i; i++; >while (i < 10);
Не забывайте изменять значение переменной, используемой в условии завершения цикла, иначе цикл никогда не закончится!
For vs While
Если вы внимательно изучили эту главу, то вы, вероятно, заметили, что оператор цикла while практически идентичен оператору цикла for, у которого не используются выражение 1 и выражение 3.
В следующем примере для вывода названий машин из массива cars используется оператор цикла for:
var cars = ["BMW", "Volvo", "Saab", "Ford"]; var i = 0; var text = ""; for (;cars[i];) < text += cars[i] + "
"; i++; >
В следующем примере для вывода названий машин из массива cars используется оператор цикла while:
var cars = ["BMW", "Volvo", "Saab", "Ford"]; var i = 0; var text = ""; while (cars[i]) < text += cars[i] + "
"; i++; >
Операторы break и continue
Оператор break позволяет "выпрыгнуть" из цикла.
Оператор continue позволяет "перепрыгнуть" через один проход цикла.
Оператор break
В предыдущих главах этого учебника вы уже встречались с оператором break. Он использовался для "выпрыгивания" из оператора условия switch.
Также, оператор break может использоваться и для "выпрыгивания" из цикла.
Оператор break прерывает цикл и передает выполнение коду, следующему после оператора цикла (если есть):
for (i = 0; i < 10; i++) < if (i === 3) < break; >text += "Число: " + i + "
"; >
Оператор continue
Оператор continue прекращает текущий проход цикла, если выполняется заданное условие, и начинает следующую итерацию цикла.
В следующем примере пропускается значение 3:
for (i = 0; i < 10; i++) < if (i === 3) < continue; >text += "Число: " + i + "
"; >
Метки
Чтобы определить метку в JavaScript, вы должны перед выражением указать имя метки с двоеточием:
метка:
выражение
Операторы break и continue единственные операторы в JavaScript, которые могут "выпрыгивать" из блока кода.
Оператор continue (с ссылкой на метку или без) единственный способ пропустить один проход цикла.
Оператор break (без ссылки на метку) единственный способ выйти из цикла или условного оператора switch.
Оператор break с ссылкой на метку позволяет выйти из любого блока кода и перейти в конкретное место программы:
var cars = ["BMW", "Volvo", "Saab", "Ford"]; list: < text += cars[0] + "
"; text += cars[1] + "
"; text += cars[2] + "
"; break list; text += cars[3] + "
"; text += cars[4] + "
"; text += cars[5] + "
"; >
Стоит напомнить, что блок кода — это код, расположенный внутри фигурных скобок < и >.
continue
Инструкция continue прерывает выполнение текущей итерации текущего или отмеченного цикла, и продолжает его выполнение на следующей итерации.
Синтаксис
continue [ label ];
Идентификатор, являющийся меткой ( label ) инструкции.
Описание
По сравнению с инструкцией break , continue прерывает выполнение цикла не полностью, вместо этого:
- В цикле while оно переносит поток выполнения к условию.
- В цикле for оно переносит поток выполнения к финальному выражению в описании цикла.
Инструкция continue может использоваться вместе с необязательной меткой, которая будет начинать следующую итерацию отмеченного цикла, а не текущего. В этом случае, continue должен находиться внутри отмеченного блока, который соответствует метке.
Примеры
Использование continue с циклом while
Пример показывает использование цикла while вместе с инструкцией continue, которая выполняется, когда i станет равно 3-м. Таким образом, n принимает значения 1, 3, 7 и 12.
= 0; n = 0; while (i 5) i++; if (i === 3) continue; > n += i; >
Использование continue вместе с меткой
В примере цикл, отмеченный checkiandj , содержит внутри себя цикл, отмеченный checkj . Если встретится инструкция continue , выполнение кода продолжится в начале блока кода checkj . При каждом вызове continue цикл checkj будет начинать новую итерацию, пока условие не начнёт возвращать false . Когда это случится, продолжится выполнение оставшейся части цикла checkiandj .
Если бы continue имело метку checkiandj , программа продолжала бы свою работу с начала цикла checkiandj .
var i = 0, j = 8; checkiandj: while (i 4) console.log("i: " + i); i += 1; checkj: while (j > 4) console.log("j: " + j); j -= 1; if (j % 2 == 0) continue checkj; console.log(j + " является нечётным."); > console.log("i token operator">+ i); console.log("j token operator">+ j); >
"i: 0"; // начало checkj "j: 8"; "7 является нечётным."; "j: 7"; "j: 6"; "5 является нечётным."; "j: 5"; // конец checkj "i = 1"; "j = 4"; "i: 1"; "i = 2"; "j = 4"; "i: 2"; "i = 3"; "j = 4"; "i: 3"; "i = 4"; "j = 4";
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-continue-statement |
Поддержка браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.
Операторы перехода и обработка исключений
Еще одной категорией операторов языка JavaScript являются операторы перехода. Как следует из названия, эти операторы заставляют интерпретатор JavaScript переходить в другое место в программном коде. Оператор break заставляет интерпретатор перейти в конец цикла или другой инструкции. Оператор continue заставляет интерпретатор пропустить оставшуюся часть тела цикла, перейти обратно в начало цикла и приступить к выполнению новой итерации. В языке JavaScript имеется возможность помечать инструкции именами, благодаря чему в операторах break и continue можно явно указывать, к какому циклу или к какой другой инструкции они относятся.
Оператор return заставляет интерпретатор перейти из вызванной функции обратно в точку ее вызова и вернуть значение вызова. Оператор throw возбуждает исключение и предназначен для работы в сочетании с операторами try/catch/finally, которые определяют блок программного кода для обработки исключения. Это достаточно сложная разновидность операторов перехода: при появлении исключения интерпретатор переходит к ближайшему объемлющему обработчику исключений, который может находиться в той же функции или выше, в стеке возвратов вызванной функции.
Подробнее все эти операторы перехода описываются в следующих подразделах.
Метки инструкций
Любая инструкция может быть помечена указанным перед ней идентификатором и двоеточием:
идентификатор: инструкция
Помечая инструкцию, вы тем самым даете ей имя, которое затем можно будет использовать в качестве ссылки в любом месте в программе. Пометить можно любую инструкцию, однако помечать имеет смысл только инструкции, имеющие тело, такие как циклы и условные инструкции.
Присвоив имя циклу, его затем можно использовать в инструкциях break и continue, внутри цикла для выхода из него или для перехода в начало цикла, к следующей итерации. Инструкции break и continue являются единственными инструкциями в языке JavaScript, в которых можно указывать метки - о них подробнее рассказывается далее. Ниже приводится пример инструкции while с меткой и инструкции continue, использующей эту метку:
mainloop: while (token != null) < // Программный код опущен. continue mainloop; // Переход к следующей итерации именованного цикла >
Идентификатор, используемый в качестве метки инструкции, может быть любым допустимым идентификатором JavaScript, кроме зарезервированного слова. Имена меток отделены от имен переменных и функций, поэтому в качестве меток допускается использовать идентификаторы, совпадающие с именами переменных или функций.
Метки инструкций определены только внутри инструкций, к которым они применяются (и, конечно же, внутри вложенных в них инструкций). Вложенные инструкции не могут помечаться теми же идентификаторами, что и вмещающие их инструкции, но две независимые инструкции могут помечаться одинаковыми метками. Помеченные инструкции могут помечаться повторно. То есть любая инструкция может иметь множество меток.
Оператор break
Оператор break приводит к немедленному выходу из самого внутреннего цикла или оператора switch. Ранее мы уже видели примеры использования оператора break внутри оператора switch. В циклах он обычно используется для немедленного выхода из цикла, когда по каким-либо причинам требуется завершить выполнение цикла.
Когда цикл имеет очень сложное условие завершения, зачастую проще бывает реализовать эти условия с помощью оператора break, чем пытаться выразить их в одном условном выражении цикла. Следующий пример пытается отыскать элемент массива с определенным значением. Цикл завершается обычным образом по достижении конца массива или с помощью оператора break, как только будет найдено искомое значение:
var arr = ['а','б','в','г','д'], result; for (var i = 0; i < arr.length; i++) < // Ищем символ 'в' в массиве и прерываем цикл if (arr[i] == 'в') < result = true; break; >> console.log((result) ? 'элемент найден' : 'элемент не найден');
В языке JavaScript допускается указывать имя метки за ключевым словом break (идентификатор без двоеточия):
break имя_метки;
Когда оператор break используется с меткой, она выполняет переход в конец именованной инструкции или прекращение ее выполнения. В случае отсутствия инструкции с указанной меткой попытка использовать такую форму оператора break порождает синтаксическую ошибку. Именованная инструкция не обязана быть циклом или оператором switch. Оператор break с меткой может выполнять «выход» из любой вмещающей ее инструкции. Объемлющая инструкция может даже быть простым блоком инструкций, заключенным в фигурные скобки исключительно с целью пометить его.
Между ключевым словом break и именем метки не допускается вставлять символ перевода строки. Дело в том, что интерпретатор JavaScript автоматически вставляет пропущенные точки с запятой: если разбить строку программного кода между ключевым словом break и следующей за ним меткой, интерпретатор предположит, что имелась в виду простая форма этого оператора без метки, и добавит точку с запятой.
Оператор break с меткой необходим, только когда требуется прервать выполнение инструкции, не являющейся ближайшим объемлющим циклом или оператором switch.
Оператор continue
Оператор continue схож с оператором break. Однако вместо выхода из цикла оператор continue запускает новую итерацию цикла. Синтаксис оператора continue столь же прост, как и синтаксис оператора break. Оператор continue может также использоваться с меткой.
Оператор continue, как в форме без метки, так и с меткой, может использоваться только в теле цикла. Использование его в любых других местах приводит к синтаксической ошибке. Когда выполняется оператор continue, текущая итерация цикла прерывается и начинается следующая. Для разных типов циклов это означает разное:
- В цикле while указанное в начале цикла выражение проверяется снова, и если оно равно true, тело цикла выполняется с начала.
- В цикле do/while происходит переход в конец цикла, где перед повторным выполнением цикла снова проверяется условие.
- В цикле for вычисляется выражение инкремента и снова вычисляется выражение проверки, чтобы определить, следует ли выполнять следующую итерацию.
- В цикле for/in цикл начинается заново с присвоением указанной переменной имени следующего свойства.
Обратите внимание на различия в поведении оператора continue в циклах while и for. Цикл while возвращается непосредственно к своему условию, а цикл for сначала вычисляет выражение инкремента, а затем возвращается к условию. В следующем примере показано использование оператора continue без метки для выхода из текущей итерации цикла для четных чисел:
var sum = 0; // Вычислить сумму не четных чисел от 0 - 10 for (var i = 0; i console.log(sum); // 25
Оператор continue, как и break, может применяться во вложенных циклах в форме, включающей метку, и тогда заново запускаемым циклом необязательно будет цикл, непосредственно содержащий оператор continue. Кроме того, как и для break, переводы строк между ключевым словом continue и именем метки не допускаются.
Оператор return
Вызов функции является выражением и подобно всем выражениям имеет значение. Оператор return внутри функций служит для определения значения, возвращаемого функцией. Оператор return может располагаться только в теле функции. Присутствие его в любом другом месте является синтаксической ошибкой. Когда выполняется оператор return, функция возвращает значение выражения вызывающей программе. Например:
function getSumArray(arr) < // Подсчитать сумму всех элементов массива var sum = 0; for (var i = 0; i < arr.length; i++) sum += arr[i]; // Вернуть значение return sum; >// Вызовем функцию с произвольным числовым массивом console.log( getSumArray([1,2,3,4,5,6,7,8,9]) );
Если функция не имеет оператора return, при ее вызове интерпретатор будет выполнять инструкции в теле функции одну за другой, пока не достигнет конца функции, и затем вернет управление вызвавшей ее программе. В этом случае выражение вызова вернет значение undefined. Оператор return часто является последней инструкцией в функции, но это совершенно необязательно: функция вернет управление вызывающей программе, как только будет достигнут оператор return, даже если за ним следуют другие инструкции в теле функции.
Оператор return может также использоваться без выражения, тогда она просто прерывает выполнение функции и возвращает значение undefined вызывающей программе. Например:
function myFun(arr) < // Если массив содержит отриц. числа, прервать функцию for (var i = 0; i
Оператор throw
- это сигнал, указывающий на возникновение какой-либо исключительной ситуации или ошибки. - это способ просигнализировать о такой ошибке или исключительной ситуации. - значит обработать его, т.е. предпринять действия, необходимые или подходящие для восстановления после исключения.
В JavaScript исключения возбуждаются в тех случаях, когда возникает ошибка времени выполнения и когда программа явно возбуждает его с помощью оператора throw. Исключения перехватываются с помощью операторов try/catch/finally, которые описываются позже.
Оператор throw имеет следующий синтаксис:
throw выражение;
Результатом выражения может быть значение любого типа. Оператору throw можно передать число, представляющее код ошибки, или строку, содержащую текст сообщения об ошибке. Интерпретатор JavaScript возбуждает исключения, используя экземпляр класса Error одного из его подклассов, и вы также можете использовать подобный подход. Объект Error имеет свойство name, определяющее тип ошибки, и свойство message, содержащее строку, переданную функции-конструктору. Ниже приводится пример функции, которая возбуждает объект Error при вызове с недопустимым аргументом:
// Функция факториала числа function factorial(number) < // Если входной аргумент не является допустимым значением, // возбуждается исключение! if (number < 0) throw new Error("Число не может быть отрицательным"); // В противном случае значение вычисляется и возвращается нормальным образом for (var i = 1; number >1; i *= number, number--); /* пустое тело цикла */ return i; > console.log('5! = ', factorial(5)); console.log('-3! = ', factorial(-3));
Когда возбуждается исключение, интерпретатор JavaScript немедленно прерывает нормальное выполнение программы и переходит к ближайшему обработчику исключений. В обработчиках исключений используется оператор catch конструкции try/catch/finally, описание которой приведено в следующем разделе.
Если блок программного кода, в котором возникло исключение, не имеет соответствующей конструкции catch, интерпретатор анализирует следующий внешний блок программного кода и проверяет, связан ли с ним обработчик исключений. Это продолжается до тех пор, пока обработчик не будет найден.
Если исключение генерируется в функции, не содержащей конструкции try/catch/finally, предназначенной для его обработки, то исключение распространяется выше, в программный код, вызвавший функцию. Таким образом исключения распространяются по лексической структуре методов JavaScript вверх по стеку вызовов. Если обработчик исключения так и не будет найден, исключение рассматривается как ошибка и о ней сообщается пользователю.
Конструкция try/catch/finally
Конструкция try/catch/finally реализует механизм обработки исключений в JavaScript. Оператор try в этой конструкции просто определяет блок кода, в котором обрабатываются исключения. За блоком try следует оператор catch с блоком инструкций, вызываемых, если где-либо в блоке try возникает исключение. За оператором catch следует блок finally, содержащий программный код, выполняющий заключительные операции, который гарантированно выполняется независимо от того, что происходит в блоке try.
И блок catch, и блок finally не являются обязательными, однако после блока try должен обязательно присутствовать хотя бы один из них. Блоки try, catch и finally начинаются и заканчиваются фигурными скобками. Это обязательная часть синтаксиса, и она не может быть опущена, даже если между ними содержится только одна инструкция.
Следующий фрагмент иллюстрирует синтаксис и назначение конструкции try/catch/finally:
try < // Обычно этот код без сбоев работает от начала до конца. // Но в какой-то момент в нем может быть сгенерировано исключение // либо непосредственно с помощью оператора throw, либо косвенно - // вызовом метода, генерирующего исключение. >catch (ex) < // Инструкции в этом блоке выполняются тогда и только тогда, когда в блоке try // возникает исключение. Эти инструкции могут использовать локальную переменную ex, // ссылающуюся на объект Error или на другое значение, указанное в операторе throw. // Этот блок может либо некоторым образом обработать исключение, либо // проигнорировать его, делая что то другое, либо заново сгенерировать // исключение с помощью оператора throw. >finally < // Этот блок содержит инструкции, которые выполняются всегда, независимо от того, // что произошло в блоке try. Они выполняются, если блок try завершился: // 1) как обычно, достигнув конца блока // 2) из-за операторов break, continue или return // 3) с исключением, обработанным приведенным в блоке catch выше // 4) с неперехваченным исключением, которое продолжает свое // распространение на более высокие уровни >
Обратите внимание, что за ключевым словом catch следует идентификатор в скобках. Этот идентификатор похож на параметр функции. Когда будет перехвачено исключение, этому параметру будет присвоено исключение (например, объект Error). В отличие от обычной переменной идентификатор, ассоциированный с оператором catch, существует только в теле блока catch.
Далее приводится более реалистичный пример конструкции try/catch. В нем вызываются метод factorial(), определенный в предыдущем примере, и методы prompt() и alert() клиентского JavaScript для организации ввода и вывода:

Это пример конструкции try/catch без оператора finally. Хотя finally используется не так часто, как catch, тем не менее иногда этот оператор оказывается полезным. Блок finally гарантированно исполняется, если исполнялась хотя бы какая-то часть блока try, независимо от того, каким образом завершилось выполнение программного кода в блоке try. Эта возможность обычно используется для выполнения заключительных операций после выполнения программного кода в продолжении try.
В обычной ситуации управление доходит до конца блока try, а затем переходит к блоку finally, который выполняет необходимые заключительные операции. Если управление вышло из блока try как результат выполнения операторов return, continue или break, перед передачей управления в другое место выполняется блок finally.
Если в блоке try возникает исключение и имеется соответствующий блок catch для его обработки, управление сначала передается в блок catch, а затем - в блок finally. Если отсутствует локальный блок catch, то управление сначала передается в блок finally, а затем переходит на ближайший внешний блок catch, который может обработать исключение.
Если сам блок finally передает управление с помощью операторов return, continue, break или throw или путем вызова метода, генерирующего исключение, незаконченная команда на передачу управления отменяется и выполняется новая. Например, если блок finally сгенерирует исключение, это исключение заменит любое ранее сгенерированное исключение.
