На этом шаге мы рассмотрим способы определения и вызова функций.
В программировании часто бывает нужно одну и ту же группу команд повторять несколько раз. Если повторение происходит "на месте" - используются циклы (о них мы поговорим позже). Если код нужно повторять в разных местах программы - используются функции.
Чтобы использовать функцию, необходимо вначале ее определить. Формальный синтаксис описания функции следующий:
function ИмяФункции (список формальных аргументов, разделенных запятыми) { . . . . . //Тело функции . . . . . return значение; }
Блок операторов, заключенных в фигурные скобки, называется телом функции. В теле функции могут использоваться формальные аргументы - переменные, имена которых перечислены через запятую. При вызове функции в скобках после ее имени указывается список фактических параметров - формальные аргументы заменяются на фактические, а тело функции как бы подставляется на место ее вызова и выполняется.
Операторы тела функции могут включать в себя вызовы других функций, определенных в текущем приложении. Различие между определением и вызовом функции традиционно для языков программирования. Определение функции просто называет функцию и задает выполняемые ею действия. Запрос функции исполняет указанные действия с фактическими параметрами. Желательно определять функции для страницы в разделе <HEAD> документа. В этом случае все функции будут определены прежде, чем будет загружено содержание документа. Иначе, в то время как страница еще не полностью загружена, пользователь может исполнить действие, которое вызывает функцию, работающую с еще не загруженным элементом страницы, что может привести к ошибке.
Команда return, возвращающая значение функции, может быть не одна, а может и вовсе отсутствовать. В последнем случае функция не возвращает никакого значения, и ее вызов нельзя использовать в выражениях. В частности, вызов функции, не возвращающей значения, не может быть использован в команде присваивания.
Приведем простейший пример вызова функции, которая возвращает модуль числа.
<HTML> <HEAD> <TITLE>Создание функций</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- function abs(a) { a = (a<0)?-a:a; return a; } var x = -2; var y = abs(x); alert ("Модуль числа "+x+" равен "+y); //--> </SCRIPT> </HEAD> <BODY> </BODY> </HTML>
Результат работы скрипта приведен на рисунке 1.
Рис.1. Использование функций
Выполнение по шагам:
Наибольший интерес в приведенном скрипте представляет строка a = (a<0)?-a:a;, которая содержит условную операцию. Эта операция содержит три операнда. Сначала вычисляется значение первого выражения, представляющего собой условие. Если значение отлично от нуля (истинно), то вычисляется значение второго выражения, которое и становится значением условной операции. В противном случае вычисляется значение третьего выражения, которое становится значением условной операции.
При x=-2; условие a<0 истинно, поэтому условная операция в качестве своего значения возвращает значение выражения -a, которое затем возвращается из функции.
Отметим, что тело приведенного скрипта можно представить, объединив имеющиеся в нем конструкции:
return a<0? -a:a;
Команда вызова функции имеет следующий вид:
ИмяФункции (список фактических аргументов, разделенных запятыми);
Длина имени функций и переменных в JavaScript не ограничивается, но имя должно быть одним словом (без пробелов). Имя строится из латинских букв, арабских цифр, знаков подчеркивания и некоторых других (не рекомендуемых) спецзнаков. Русские буквы использовать нельзя и первым символом имени должна быть буква или знак подчеркивания.
Если функция не возвращает значение, то при ее вызове рекомендуется использовать служебное слово void:
void ИмяФункции (список фактических аргументов, разделенных запятыми);
Перепишем последний скрипт, использовав в нем конструкцию void.
<HTML> <HEAD> <TITLE>Создание функций</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- function abs(a) { var b = a; a = (a<0)?-a:a; alert ("Модуль числа "+b+" равен "+a); //return a; } var x = -2; void abs(x); //--> </SCRIPT> </HEAD> <BODY> </BODY> </HTML>
На следующем шаге мы рассмотрим правила передачи аргументов.