Глава 3.6. Операторы и функции3.6.1. Операторы JavaScriptУправление последовательностью действий в ходе выполнения сценария осуществляется с помощью операторов. JavaScript содержит стандартный набор операторов, унаследованный от языков C++ и Java, а именно:
Следующие операторы описаны в других разделах справочника:
Любое выражение JavaScript также является оператором. 3.6.2. Условный операторУсловный оператор if else позволяет проверить определенное условие и, в зависимости от его истинности, выполнить ту или иную последовательность операторов. Он имеет две формы: if (условие) оператор1 if (условие) оператор1 else оператор2 Здесь условие это любое выражение, значение которого может быть преобразовано к логическому типу, оператор1 и оператор2 любые группы операторов JavaScript; если эти группы содержат более одного оператора, то они должны быть заключены в фигурные скобки {}. Первая форма оператора означает, что если значение условия истинно, то выполняются операторы1; если оно ложно, то управление передается оператору, следующему за if. Вторая форма оператора означает, что если значение условия истинно, то выполняются операторы1; если оно ложно, то выполняются операторы2. Пример использования условного оператора в теле функции, возвращающей наибольшее из трех чисел: function maxValue(x, y, z) { if (x >= y) { if (x >= z) return x; else return z; } else { if (y >= z) return y; else return z; } } 3.6.3. Оператор выбораОператор выбора switch выполняет ту или иную последовательность операторов в зависимости от значения определенного выражения. Он имеет вид: switch (выражение) { case значение: операторы break; case значение: операторы break; ... default: операторы } Здесь выражение это любое выражение, значение это возможное значение выражения, а операторы любые группы операторов JavaScript. Оператор выбора сначала вычисляет значение выражения, а затем проверяет, нет ли этого значения в одной из меток case значение. Если такая метка есть, то выполняются операторы, следующие за ней; если нет, то выполняются операторы, следующие за меткой default (если она отсутствует, то управление передается оператору, следующему за switch). Необязательный оператор break указывает, что после выполнения операторов управление передается оператору, следующему за switch. Если break отсутствует, то после выполнения операторов начинают выполняться операторы, стоящие после следующей метки case (управление как бы "проваливается" в следующую метку). В следующем примере значение переменной length преобразуется в метры в зависимости от начальной единицы измерений, заданной в переменной str. Обратите внимание, что после case "м" нет оператора break; в данном случае это означает, что эта метка и метка default обрабатываются одинаково, а именно значение переменной length не изменяется. var str = "см"; var length = 25; switch (str) { case "км": length *= 1000; break; case "см": length /= 100; break; case "м": default: break; } 3.6.4. Операторы циклаЦикл это последовательность операторов, выполнение которой повторяется до тех пор, пока определенное условие не станет ложным. JavaScript содержит три оператора цикла: for, while и do while, а также операторы break и continue, которые используются внутри циклов. Близок к операторам цикла и оператор итерации for in, используемый при работе с объектами. 3.6.4.1. Оператор forОператор цикла for имеет вид: for (инициализация; условие; изменение) оператор Здесь инициализация и изменение это любое выражения, условие любое выражение, значение которого может быть преобразовано к логическому типу, оператор любая группа операторов JavaScript; если эти группа содержит более одного оператора, то она должны быть заключена в фигурные скобки {}. Инициализация может содержать декларацию переменной. Оператор for выполняется следующим образом:
Данный оператор обычно используется в тех случаях, когда количество повторений цикла известно заранее. Например, следующая функция обнуляет все элементы массива, переданного ей в качестве аргумента: function initArray(a) { for (var i = 0; i < a.length; i++) a[i] = 0; } 3.6.4.2. Оператор whileОператор цикла while имеет вид: while (условие) оператор Здесь условие любое выражение, значение которого может быть преобразовано к логическому типу, оператор - любая группа операторов JavaScript; если эти группа содержит более одного оператора, то она должны быть заключена в фигурные скобки {}. Оператор while выполняется следующим образом:
При использовании данного оператора необходимо убедиться, что рано или поздно условие станет ложным, т. к. иначе сценарий войдет в бесконечный цикл, например: while (true) document.write("Привет всем!"); 3.6.4.3. Оператор do whileОператор цикла do while имеет вид: do оператор while (условие) Здесь условие любое выражение, значение которого может быть преобразовано к логическому типу, оператор - любая группа операторов JavaScript; если эти группа содержит более одного оператора, то она должны быть заключена в фигурные скобки {}. Оператор do while выполняется следующим образом:
Этот оператор отличается от оператора while тем, что цикл обязательно выполняется хотя бы раз. Пример: var i = 0; do document.write(i++); while (i < 10); 3.6.4.4. Метки операторовЛюбой оператор или блок операторов в сценарии на языке JavaScript может иметь любое количество меток. Метки используются операторами break и continue для указания того, к какому оператору они относятся. Помеченный оператор имеет вид: метка: оператор В качестве метки может использоваться любой идентификатор, который не является зарезервированным словом. Хотя в современном программировании использование меток считается дурным тоном, в некоторых случаях их применение существенно упрощает логику программы. Чаще всего это происходит, когда метки используются для передачи управления из глубоко вложенного цикла к внешнему. 3.6.4.5. Оператор breakОператор break прерывает выполнение текущего цикла, оператора switch или помеченный оператора и передает управление оператору, следующему за прерванным. Этот оператор может употребляться только внутри циклов while, do while, for или for in, а также внутри оператора switch. Он имеет две формы: break break метка Первая форма оператора прерывает выполнение самого внутреннего из циклов или операторов switch. Вторая форма оператора прерывает выполнение оператора с заданной меткой. Пример оператора break в теле функции, возвращающей номер элемента массива, содержащего заданное значение: function findValue(a, theValue) { for (var i = 0; i < a.length; i++) { if (a[i] == theValue) break; } return i; } 3.6.4.6. Оператор continueОператор continue завершает текущую итерацию текущего цикла или цикла, помеченного соответствующей меткой, и начинает новую итерацию. Этот оператор может употребляться только внутри циклов while, do while, for или for in. Он имеет две формы: continue continue метка Первая форма оператора завершает текущую итерацию самого внутреннего из циклов. Вторая форма оператора завершает текущую итерацию оператора с заданной меткой. При этом переход к следующей итерации цикла происходит следующим образом:
В следующем примере к переменной n последовательно добавляются значения 1, 2, 4 и 5: var i = 0; var n = 0; while (i < 5) { i++; if (i == 3) continue; n += i; } 3.6.5. Оператор for inОператор for in выполняет заданные действия для каждого свойства объекта или для каждого элемента массива. Он имеет вид: for (переменная in выражение) оператор Здесь переменная это декларация переменной, выражение любое выражение, значением которого является объект или массив, оператор любая группа операторов JavaScript; если эти группа содержит более одного оператора, то она должны быть заключена в фигурные скобки {}. Оператор for in выполняется следующим образом:
При итерации массива переменной последовательно присваиваются значение первого, второго, ..., последнего элемента массива. Однако, при итерации свойств объекта невозможно предсказать, в каком порядке они будут присваиваться переменной: этот оператор гарантирует только то, что все они будут просмотрены. Следующий сценарий создает новый объект ob, а затем последовательно выводит все его свойства на экран обозревателя: var ob = {"а" : "Архангельск", "б" : "Баку", "в" : "Воронеж"}; for (var key in ob) document.write(key + ": " + ob[key] + "<BR>"); На экране появится текст а: Архангельск б: Баку в: Воронеж 3.6.6. Оператор withОператор with задает имя объекта по умолчанию. Он имеет вид: with (выражение) оператор Здесь выражение любое выражение, значением которого является объект, оператор любая группа операторов JavaScript; если эти группа содержит более одного оператора, то она должны быть заключена в фигурные скобки {}. Этот оператор действует следующим образом. Для каждого идентификатора в операторе исполняющая система проверяет, не является ли он именем свойства объекта, заданного по умолчанию. Если да, то этот идентификатор считается именем свойства, если же нет, то именем переменной. Оператор with используется для сокращения размера программного кода и ускорения доступа к свойствам объектов. Например, для доступа к математическим функциям мы должны каждый раз указывать имя объекта Math: x = Math.cos(Math.PI / 2) + Math.sin(Math.LN10); y = Math.tan(2 * Math.E); С помощью оператора with этот фрагмент сценария можно существенно укоротить: with (Math) { x = cos(PI / 2) + sin(LN10); y = tan(2 * E); } Примечание. Оператор with может применяться только к существующим свойствам и методам объекта. Попытка создания нового свойства или метода с его помощью вызовет ошибку. 3.6.7. Обработка исключений3.6.7.1. Понятие исключенияВ процессе исполнения сценария возможно возникновение неустранимых ошибок, называемых исключениями. Примерами исключений являются обращение к несуществующему объекту или невозможность преобразования значения к заданному типу. Подробнее о реализации исключений см. описание объектов Error. Операторы, описанные в этом разделе, предназначены для обработки исключений, возникающих в ходе исполнения сценария, и генерации собственных исключений. 3.6.7.2. Оператор try catchОператор try catch используется в тех фрагментах сценария, где может возникнуть исключение, для его обработки. Он имеет вид: try { оператор1 } catch (исключение) { оператор2 } Здесь исключение любое имя переменной, а оператор1 и оператор2 любые группы операторов JavaScript, заключенные в фигурные скобки {}. Оператор1 содержит программный код, в котором возможно возникновение исключения. Если исключение не возникло, то после исполнения оператора1 управление передается обычным образом оператору, следующему за try catch. Если же оно возникло, то информация об исключении заносится в локальную переменную исключение, и управление передается оператору2, который должен содержать код обработки этого исключения. Если возникшее исключение не может быть здесь обработано, то оператор2 должен содержать оператор throw для передачи исключения обработчику исключений более высокого уровня. Пример использования этого оператора приведен в следующем разделе. См. также WDH+: Оператор try catch в IE4. 3.6.7.3. Оператор throwОператор throw генерирует исключение, которое может быть обработано оператором try catch. Он имеет вид: throw исключение где исключение любое выражение. Значение выражения исключение присваивается локальной переменной, указанной в операторе catch. Пример генерации исключения и его обработки: function getMonthName(month) { month = month - 1; // Переводим month в индекс массива (1=январь, 12=декабрь) var months=new Array("январь","февраль","март","апрель","май","июнь","июль", "август","сентябрь","октябрь","ноябрь","декабрь"); if (months[month] != null) return months[month]; else throw "Неверный месяц"; } try { monthName = getMonthName(myMonth); // возможно исключение } catch (e) { monthName="неизвестно"; } document.write(monthName); 3.6.8. Функции3.6.8.1. Декларация функцииФункции являются одним из основных механизмов языка JavaScript; они охватывают ту область, которая в других языках программирования реализуется подпрограммами, процедурами и функциями. Функция в JavaScript это набор операторов, выполняющих определенную задачу. Для того, чтобы пользоваться функцией, мы должны сначала ее определить. Декларация функции имеет вид: function имя(аргументы?) { операторы } Здесь имя идентификатор, задающий имя функции, аргументы необязательный список идентификаторов, разделенных запятыми, который содержит имена формальных аргументов функции, а операторы любой набор операторов, который называется телом функции и исполняется при ее вызове. Рассмотрим следующий пример: function cube(number) { return number * number * number; } Эта функция называется cube и имеет один формальный аргумент number. При вызове этой функции вместо формального аргумента подставляется его фактическое значение, функция выполняет возведение этого значения в куб и возвращает полученное число оператором return. Переменные, декларированные в теле функции, являются локальными, т. е. недоступны вне ее тела. Подробности см. в описании области действия переменных. 3.6.8.2. Вызов функцииВажно понимать, что появление декларации функции в тексте сценария не означает ее немедленного выполнения; тело функции будет выполняться только тогда, когда какой-либо оператор будет содержать вызов этой функции. Например, функция из предыдущего примера может быть вызвана так: var x = cube(5); В результате переменная x получит значение 125. В JavaScript действуют следующие правила передачи аргументов функции:
function setBrowser(browser) { browser.name = "Internet Explorer"; browser.version = "5.5"; } var myBrowser = {name:"Netscape Navigator", version:"4.7"}; var x = myBrowser.name; // x равно "Netscape Navigator" setBrowser(myBrowser); // объект myBrowser передается функции var y = myBrowser.name; // y равно "Internet Explorer" 3.6.8.3. Рекурсивные функцииВажной особенностью языка JavaScript является то, что функция может вызывать не только другие функции, но и сама себя. Такие функции называются рекурсивными; во многих случаях использование рекурсии позволяет писать краткий код вместо сложных вложенных циклов. Следует, однако, учитывать, что рекурсия работает медленнее, чем обычный цикл, и пользоваться ей только в тех случаях, когда это действительно оправдано. Приведем пример функции, вычисляющей факториал числа (факториал числа n равен 1 * 2 * ... * n): function factorial(n) { if (n <= 1) return 1; else return (n * factorial(n-1)); } Неаккуратно написанная рекурсивная функция может войти в бесконечный цикл и никогда не вернуть результата. Например, попытка вычислить факториал отрицательного числа с помощью приведенной функции приведет именно к такому результату. 3.6.8.4. Оператор returnМы видели в предыдущих примерах, что функции JavaScript могут (но не обязаны) возвращать значение. Для указания этого значения используется оператор return, который имеет две формы: return выражение return Первая форма оператора завершает выполнение функции и возвращает значение выражения.
Функция, содержащая такой оператор return, должна вызываться как часть выражения
присваивания, например Вторая форма оператора завершает выполнение функции и возвращает значение undefined.
Функция, содержащая такой оператор return, должна вызываться как оператор,
например Если тело функции не содержит оператора return, то ее выполнение завершается с выполнением последнего оператора тела и возвращается значение undefined. 3.6.8.5. Объект argumentsПри входе в тело функции создается локальный объект arguments, который имеет следующие свойства:
Этот объект полезен в тех случаях, когда мы заранее не знаем количества аргументов, которые будут переданы данной функции. В следующем примере функция initArray создает новый массив и копирует в него список своих фактических аргументов. function initArray() { this.length = initArray.arguments.length; for (var i = 0; i < this.length; i++) this[i] = initArray.arguments[i]; } var myFriends = new initArray("Михаил", "Максим", "Сергей", "Леонид"); |