Оператор прерывания break позволяет прервать выполнение цикла и перейти к следующему за ним выражению:
while (a < 100) {
a = a * i + 2;
if (a > 50) break;
++i;
}
В этом примере мы прерываем выполнение цикла, если значение переменной a превысит 50.
Оператор перезапуска continue позволяет перезапустить цикл, т. е. оставить невыполненными все последующие выражения, входящие в тело цикла, и запустить выполнение цикла с самого его начала: проверка условия, выполнение приращения и тела и т. д.
Пример:
while (a < 100) {
i = ++i;
if (i > 9 && i < 11) continue;
a = a * i + 2;
}
Здесь мы пропускаем выражение, вычисляющее a, для всех значений i от 10 до 20.
Функции
Функция — это особым образом написанный и оформленный фрагмент кода JavaScript, который можно вызвать из любого Web-сценария на данной Web-странице (повторно используемый код, как его часто называют). Так что, если какой-то фрагмент кода встречается в нескольких местах нашего Web-сценария, лучше всего оформить его в виде функции.
Собственно код, ради которого и была создана функция, называется телом функции. Каждая функция, кроме того, должна иметь уникальное имя, по которому к ней можно будет обратиться. Функция также может принимать один или несколько параметров и возвращать результат, который можно использовать в выражениях.
Объявление функций
Прежде чем функция будет использована где-то в Web-сценарии, ее нужно объявить. Функцию объявляют с помощью ключевого слова function:
function <имя функции>([<список параметров, разделенных запятыми>])
<тело функции>
Имя функции, как уже говорилось, должно быть уникально в пределах Web- страницы. Для имен функций действуют те же правила, что и для имен переменных.
Список параметров представляет собой набор переменных, в которые при вызове функции будут помещены значения переданных ей параметров. (О вызове функций будет рассказано далее.) Мы можем придумать для этих переменных любые имена — все равно они будут использованы только внутри тела функции. Это так называемые формальные параметры функции.
Список параметров функции помещают в круглые скобки и ставят после ее имени; сами параметры отделяют друг от друга запятыми. Если функция не требует параметров, следует указать пустые скобки — это обязательно.
В пределах тела функции над принятыми ею параметрами (если они есть) и другими данными выполняются некоторые действия и, возможно, вырабатывается результат. Оператор возврата return возвращает результат из функции в выражение, из которого она была вызвана:
return <переменная или выражение>;
Здесь переменная должна содержать возвращаемое значение, а выражение должно его вычислять.
Пример объявления функции:
function divide(a, b) {
var c;
c = a / b;
return c;
}
Данная функция принимает два параметра — a и b, — после чего делит a на b и возвращает частное от этого деления.
Эту функцию можно записать компактнее:
function divide(a, b) {
return a / b;
}
Или даже так, в одну строку:
function divide(a, b) { return a / b; }
JavaScript позволяет нам создавать так называемые необязательные параметры функций — параметры, которые при вызове можно не указывать, после чего они примут некоторое значение по умолчанию. Вот пример функции с необязательным параметром b, имеющим значение по умолчанию 2:
function divide(a, b) {
if (typeof(b) == "undefined") b = 2;
return a / b;
}
Понятно, что мы должны как-то выяснить, был ли при вызове функции указан параметр b. Для этого мы используем оператор получения типа typeof (он был описан ранее). Если параметр b не был указан, данный оператор вернет строку "undefined"; тогда мы создадим переменную с именем b, как и у необязательного параметра, и присвоим ей число 2 — значение этого параметра по умолчанию, — которое и будет использовано в теле функции. Если возвращенное оператором значение иное, значит, параметр b был указан при вызове, и мы используем значение, которое было передано с ним.
Функции и переменные. Локальные переменные
Объявленные ранее функции создают внутри своего тела собственные переменные. Это так называемые локальные переменные. Такие переменные доступны только внутри тела функции, в котором они объявлены. При завершении выполнения функции все объявленные в ней локальные переменные уничтожаются.
Разумеется, любая функция может обращаться к любой переменной, объявленной вне ее тела (переменной уровня Web-страницы). При этом нужно помнить об одной вещи. Если существуют две переменные с одинаковыми именами, одна — уровня Web-страницы, другая — локальная, то при обращении по этому имени будет получен доступ к локальной переменной. Одноименная переменная уровня страницы будет "замаскирована" своей локальной "тезкой".
Вызов функций
После объявления функции ее можно вызвать из любого Web-сценария, присутствующего на этой же Web-странице. Формат вызова функции:
<имя функции>([<список фактических параметров, разделенных запятыми>])
Здесь указывается имя нужной функции и в круглых скобках перечисляются фактические параметры, над которыми нужно выполнить соответствующие действия.
Функция вернет результат, который можно присвоить переменной или использовать в выражении.
ВНИМАНИЕ!
При вызове функции подставляйте именно фактические параметры, а не формальные, указанные в объявлении функции.
Вот пример вызова объявленной нами ранее функции divide:
d = divide(3, 2);
Здесь мы подставили в выражение вызова функции фактические параметры — константы 3 и 2.
А здесь мы выполняем вызов функции с переменными в качестве фактических параметров:
s = 4 * divide(x, r) + y;
Если функция имеет необязательные параметры и нас удовлетворяют их значения по умолчанию, мы можем при вызове не указывать эти параметры, все или некоторые из них. Например, функцию divide со вторым необязательным параметром мы можем вызвать так:
s = divide(4);
Тогда в переменной s окажется число 2 — результат деления 4 (значение первого параметра) на 2 (значение второго, необязательного, параметра по умолчанию).
Если функция не возвращает результат, то ее вызывают так:
initVars(1, 2, 3, 6);
Более того, так можно вызвать и функцию, возвращающую результат, который в этом случае будет отброшен. Такой способ вызова может быть полезен, если результат, возвращаемый функцией, не нужен для работы Web-сценария.
Если функция не принимает параметров, при ее вызове все равно нужно указать пустые скобки, иначе возникнет ошибка выполнения Web-сценария:
s = computeValue();
Функции могут вызывать друг друга. Вот пример:
function cmp(c, d, e) {
var f;
f = divide(c, d) + e;
return f;
}
Здесь мы использовали в функции cmp вызов объявленной ранее функции divide.
Присваивание функций. Функциональный тип данных
JavaScript позволяет выполнять над функциями один фокус — присваивать функции переменным.
Пример:
var someFunc;
someFunc = cmp;
Здесь мы присвоили переменной someFunc объявленную ранее функцию cmp. Заметим, что в этом случае справа от оператора присваивания указывают только имя функции без скобок и параметров.
Впоследствии мы можем вызывать данную функцию, обратившись к переменной, которой она была присвоена:
c = someFunc(1, 2, 3);
Здесь мы вызвали функцию cmp через переменную someFunc.
Переменная, которой была присвоена функция, хранит данные, относящиеся к функциональному типу. Это еще один тип данных, поддерживаемый JavaScript.
А можно сделать и так:
var someFunc = function(c, d, e) {
var f;
f = divide(c, d) + e;
return f;
}
Здесь мы объявили функцию и сразу же присвоили ее переменной. Как видим, имени объявляемой функции мы не указали — в данном случае оно не нужно.
А еще JavaScript позволяет нам указать функцию в качестве параметра другой функции. Для примера давайте рассмотрим фрагмент JavaScript-кода нашего второго Web-сценария:
ceLinks.on("mouseover", function(e, t) { Ext.get(t). addClass("hovered");
});
Здесь второй параметр функции on (вообще-то, это не функция, а метод объекта, но об этом потом) — другая функция, объявленная там же. Эта функция принимает два параметра и содержит одно выражение.
В следующих главах, изучая библиотеку Ext Core, мы будем часто сталкиваться с функциями, которые присваиваются переменным и передаются в качестве параметра другим функциям. Настолько часто, что скоро привыкнем к этому.