Глава 5. Операторы.
В этом примере функция checkData возвращает true, если количество символов в Text-объекте
равно трём; иначе, выводит предупреждение и возвращает false.
Здесь, если expr вычисляется в "Bananas", программа находит совпадение с case "Bananas"
и выполняет ассоциированный оператор. Если обнаружен break, программа прерывает switch
и выполняет оператор после блока оператора switch. Если break отсутствует,
оператор в case "Cherries" также будет выполнен.
Обновляющее выражение incrementExpression, если имеется, выполняется, и
управление возвращается к Шагу 2.
Пример.
Эта функция содержит оператор for, который подсчитывает количество выбранных
опций в прокручиваемом списке (объект Select, позволяющий выбрать несколько
позиций). Оператор for объявляет переменную i и инициализирует её в нуль. Он
проверяет, меньше ли i количества опций объекта Select, выполняет оператор if и
инкремент переменной i на единицу после каждого прохода цикла.
<SCRIPT>
function howMany(selectObject) {
var numberSelected=0;
for (var i=0; i < selectObject.options.length; i++) {
if (selectObject.options[i].selected==true)
numberSelected++;
}
return numberSelected;
}
</SCRIPT>
<FORM NAME="selectForm">
<P><B>Choose some music types, then click the button below:</B>
<BR><SELECT NAME="musicTypes" MULTIPLE>
<OPTION SELECTED> R&B
<OPTION> Jazz
<OPTION> Blues
<OPTION> New Age
<OPTION> Classical
<OPTION> Opera
</SELECT>
<P><INPUT TYPE="button" VALUE="How many are selected?"
onClick="alert ('Number of options selected: ' +
howMany(document.selectForm.musicTypes))">
</FORM>
Оператор do...while
Оператор do...while повторяется, пока специфицированное
выражение - false. Оператор do...while выглядит так:
do {
statement
} while (condition)
statement выполняется один раз перед проверкой условия/condition.
Если condition - true, оператор выполняется снова. В конце каждого выполнения condition
проверяется. Если condition - false, выполнение останавливается и управление передаётся оператору после do...while.
Пример.
В этом примере цикл do итерируется минимум один раз и повторяет итерации, пока i
меньше 5.
do {
i+=1;
document.write(i);
} while (i<5);
Оператор while
Оператор while выполняет свои операторы, пока
специфицированное condition/условие - true. Оператор while выглядит так:
while (condition) {
statements
}
Если condition становится false, операторы внутри цикла
прекращают выполняться и управление передаётся оператору, следующему после цикла.
Проверка условия/condition происходит до выполнения
операторов внутри цикла. Если condition возвращает true, операторы выполняются и condition
проверяется снова. Если condition возвращает false, выполнение цикла
прекращается и управление передаётся оператору, идущему после оператора while.
Пример 1.
Этот цикл while итерирует, пока n меньше 3:
n = 0;
x = 0;
while( n < 3 ) {
n ++;
x += n;
}
При каждой итерации цикл увеличивает n и прибавляет это
значение к переменной x. Следовательно, x и n принимают следующие значения:
- После первого прохода: n = 1 и x = 1
- После второго прохода: n = 2 и x = 3
- После третьего прохода: n = 3 и x = 6
После выполнения трёх проходов цикла, condition n < 3 больше не true, поэтому
выполнение цикла прерывается.
Пример 2: Бесконечный цикл.
Убедитесь, что условие цикла когда-нибудь станет false; иначе цикл никогда не
прервётся. Операторы следующего цикла while выполняются бесконечно, поскольку условие никогда не станет false:
while (true) {
alert("Hello, world") }
Оператор label
Оператор label является идентификатором, на который можно
ссылаться из любого места программы. Например, Вы можете использовать label для
идентификации цикла, а затем использовать операторы break или continue для
прерывания цикла или продолжения выполнения.
Синтаксис оператора label выглядит так:
label :
statement
Значением label может быть любой верный
идентификатор JavaScript, не являющийся зарезервированным словом. Оператор/statement,
идентифицируемый при помощи label, может быть любым оператором.
Пример.
В этом примере label markLoop идентифицирует цикл while.
markLoop:
while (theMark == true)
doSomething();
}
Оператор break
Используйте оператор break для прерывания цикла switch или оператора с меткой label.
- Если Вы используете break без label, он немедленно прерывает ближайший
содержащий while, do-while, for или switch и передаёт управление следующему
оператору.
- Если Вы используете break с label, он прерывает специфицированный помеченный
оператор.
Синтаксис оператора break таков:
1. break
2. break label
Первый вариант прерывает ближайший содержащий цикл или switch;
второй вариант прерывает специфицированный оператор, имеющий метку.
Пример.
Здесь выполняется итерация по элементам массива, пока не будет найден индекс элемента со значением theValue:
for (i = 0; i < a.length; i++) {
if (a[i] = theValue)
break;
}
Оператор continue
Оператор continue используется для рестарта операторов while, do-while, for и label.
- Если Вы используете continue без label, он прерывает текущую итерацию ближайшего
цикла while, do-while или for и продолжает выполнение этого цикла со следующей
итерации. В отличие от оператора break, continue не прерывает выполнение цикла
полностью. В цикле while он переходит на condition. В цикле for на increment-expression.
- Если Вы используете continue с label, он применяется к оператору цикла, идентифицированному этим label.
Синтаксис оператора continue таков:
1. continue
2. continue label
Пример 1.
Это пример цикла while с оператором continue, который выполняется, если значение i
равно 3. Таким образом, n получает значения 1, 3, 7 и 12.
i = 0;
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 имеет label для checkiandj, программа
продолжит выполнение от начала оператора checkiandj.
checkiandj :
while (i<4) {
document.write(i + "<BR>");
i+=1;
checkj :
while (j>4) {
document.write(j + "<BR>");
j-=1;
if ((j%2)==0)
continue checkj;
document.write(j + " is odd.<BR>");
}
document.write("i = " + i + "<br>");
document.write("j = " + j + "<br>");
}
Операторы Манипуляции Объектами
JavaScript использует операторы for...in и with для манипулирования объектами.
Оператор for...in
Оператор for...in итерирует специфицированную переменную
по всем свойствам объекта. Для каждого достигнутого свойства JavaScript
выполняет специфицированные операторы. Оператор for...in выглядит так:
for (variable in object) {
statements }
Пример.
Эта функция принимает в качестве аргумента объект и имя объекта. Затем она
итерирует по всем свойствам этого объекта и возвращает строку - список имён свойств и их значений.
function 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
Оператор with
Оператор with устанавливает объект по умолчанию для набора
блока операторов. JavaScript просматривает неквалифицированные имена внутри
блока операторов и определяет, являются ли имена свойствами объекта по умолчанию.
Если неквалифицированное имя является свойством, то это свойство используется в
операторе; иначе, используется локальная или глобальная переменная.
Оператор with выглядит так:
with (object){
statements
}
Пример.
Здесь оператор with специфицирует, что объект Math является объектом по
умолчанию. Операторы после оператора with обращаются к свойству PI и к методам cos
и sin без специфицирования объекта. JavaScript принимает объект Math как объект для этих обращений.
var a, x, y;;
var r=10
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI/2);
}
Примечание:
Использование оператора with может значительно замедлить выполнение программы.
Комментарии
Комментарии обычно разъясняют действия, выполняемые кодом.
Комментарии игнорируются интерпретатором. JavaScript поддерживает комментарии в стиле Java и C++:
- Однострочный комментарий с двойным слэшем в начале строки (//).
- Многострочный комментарий с символами /* в начале и с символами */ в конце.
Пример.Вот пример двух комментариев:
// Это однострочный комментарий.
/* А это - многострочный. Он может быть любой длины, и Вы можете
поместить сюда всё, что угодно. */
Операторы Обработки Исключений
Вы можете вызывать исключение оператором throw и обрабатывать его операторами try...catch.
Оператор try...catch используется также для обработки
исключений Java. См. разделы "Обработка Исключений Java
в JavaScript" и "Обработка Исключений JavaScript в Java".
Оператор throw
Оператор throw используется для вызова исключения. Если Вы
вызываете исключение, Вы специфицируете выражение, содержащее значение исключения:
throw expression
Следующий код вызывает несколько исключений.
throw "Error2"; // генерирует исключение со строковым значением
throw 42; //
генерирует исключение со значением 42
throw true; // генерирует
исключение со значением true
При вызове исключения Вы можете специфицировать объект.
Затем можно обратиться к свойствам объекта в блоке catch. Следующий пример
создаёт объект myUserException типа UserException и использует его в операторе throw.
// Создаётся объект типа UserException
function UserException (message) {
this.message=message;
this.name="UserException";
}
// Создаётся и вызывается экземпляр объекта
myUserException=new UserException("Value too high");
throw myUserException;
Оператор try...catch
Оператор try...catch помечает блок операторов,
пытается их выполнить и специфицирует один или более вариантов ответа при возникновении
исключения. Если исключение возникло, оператор try...catch отлавливает его.
Оператор try...catch состоит из блока try, который
содержит один или более операторов, и нуль или более блоков catch, содержащих
операторы, которые специфицируют действия при вызове исключения в блоке try. То
есть, если Вы хотите выполнить блок try и он не выполняется, Вы передаёте
управление в блок catch. Если любой оператор блока try (или оператор функции,
вызываемой из блока try) вызывает исключение, управление немедленно передаётся в
блок catch. Если исключение не было вызвано, блок catch пропускается. Блок finally
выполняется после выполнения блоков try и catch, но до выполнения оператора,
идущего после блока оператора try...catch.
В следующем примере используется оператор try...catch.
Вызывается функция, которая запрашивает название месяца из массива, базируясь на
значении, передаваемом функции. Если значение не соответствует номеру месяца (1-12),
вызывается исключение со значением "InvalidMonthNo" и операторы блока catch
устанавливают переменную в monthName значение "unknown".
function getMonthName (mo) {
mo=mo-1; // Уточняется номер месяца по индексу массива (1=Jan, 12=Dec)
var months=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul",
"Aug","Sep","Oct","Nov","Dec");
if (months[mo] != null) {
return months[mo]
} else {
throw "InvalidMonthNo"
}
}
try {
// попытка выполнить эти операторы:
monthName=getMonthName(myMonth) // функция может вызвать
исключение
}
catch (e) {
monthName="unknown"
logMyErrors(e) // объект, вызвавший
исключение, передаётся обработчику исключений
}
Блок catch
Вы можете использовать единственный блок catch для
обработки всех исключений, которые могут быть сгенерированы в блоке try, или
можете использовать отдельные блоки catch для обработки определённых типов
исключений.
Единственный блок catch
Используйте единственный в данном операторе try...catch
блок catch (восстанавливающий блок) для выполнения кода обработки ошибок
для каждого исключения, вызываемого в блоке try.
Единственный блок catch имеет следующий синтаксис:
catch (catchID) {
statements
}
Блок catch специфицирует идентификатор (catchID в
предыдущем синтаксисе), по которому содержится значение, специфицированное
оператором throw; Вы можете использовать этот идентификатор для получения
информации о вызванном исключении. JavaScript создаёт этот идентификатор при
входе в блок catch; идентификатор существует только в период выполнения блока catch;
после завершения выполнения блока catch идентификатор больше не доступен.
Например, следующий код вызывает исключение. Если
возникает исключение, управление передаётся в блок catch.
try {
throw "myException" // генерируется исключение
}
catch (e) {
// операторы для обработки любого исключения
logMyErrors(e) // исключение передаётся обработчику ошибок
}
Несколько блоков catch
Единственный оператор try может содержать несколько
условных блоков catch, каждый из которых обрабатывает специфический тип
исключения. В этом случае вход в подходящий условный блок catch выполняется
только при вызове исключения, специфицированного для данного блока. Вы можете
также по выбору включить отдельный блок catch для всех неспецифицированных
исключений как финальный блок catch в операторе.
Например, следующая функция вызывает три другие функции (объявленные
в другом месте), которые проверяют её аргументы. Если проверяющая функция
определяет, что проверяемый компонент неверен, она возвращает 0, заставляя
вызывающую функцию вызывать определённое исключение.
function getCustInfo(name, id, email)
{
var n, i, e;
if (!validate_name(name))
throw "InvalidNameException"
else
n = name;
if (!validate_id(id))
throw "InvalidIdException"
else
i = id;
if (!validate_email(email))
throw "InvalidEmailException"
else
e = email;
cust = (n + " " + i + " " + e);
return (cust);
}
Условные блоки catch управляют вызовом соответствующего обработчика исключений.
try {
// функция может вызвать три вида исключений
getCustInfo("Lee", 1234, "lee@netscape.com")
}
catch (e if e == "InvalidNameException") {
// вызывает обработчик неправильных имён
bad_name_handler(e)
}
catch (e if e == "InvalidIdException") {
// вызывает обработчик неправильных ids/идентификаторов
bad_id_handler(e)
}
catch (e if e == "InvalidEmailException") {
// вызывает обработчик неправильных email-адресов
bad_email_handler(e)
}
catch (e){
// незвестное исключение записывается в log-файл
logError(e)
}
Блок finally
Блок finally содержит операторы, выполняемые после
выполнения блоков try и catch, но до выполнения операторов, идущих после
оператора try...catch. Блок finally выполняется независимо от того, было ли
вызвано исключение. Если исключение вызывается, операторы блока finally
выполняются даже в том случае, если ни один блок catch не обработал исключение.
Вы можете использовать блок finally для корректного
завершения скрипта при возникновении исключения; например, Вам может
понадобиться освободить ресурс, связанный скриптом. В следующем примере файл
открывается и операторы работают с ним (серверный JavaScript даёт возможность
доступа к файлам). Если вызывается исключение при открытом файле, блок finally
закрывает файл до того, как скрипт потерпит неудачу.
openMyFile();
try {
writeMyFile(theData)
}
finally {
closeMyFile() // ресурс всегда закрывается
}
Вложение операторов try...catch
Вы можете вкладывать один или более операторов try...catch
друг в друга. Если внутренний оператор try...catch не имеет блока catch, на
совпадение проверяется блок catch содержащего его оператора try...catch.
Назад Оглавление
Индекс Вперёд
Copyright © 2000 Netscape Communications Corp.
Все Права Зарезервированы.
Дата последнего обновления
28 сентября 2000 года.