Как мы видели в главе 6, самый распространенный способ определения функции – использование инструкции function. Она состоит из ключевого слова function, за которым следуют:
• имя функции;
• заключенный в круглые скобки необязательный список имен параметров, разделенных запятыми;
• JavaScript_инструкции, составляющие тело функции, заключенные в фигур_ ные скобки.
140 Глава 8. Функции
В примере 8.1 показаны определения некоторых функций. Хотя эти функции короткие и простые, они содержат все перечисленные здесь элементы. Обратите внимание: в функциях может быть определено различное количество аргумен_ тов, функции также могут содержать или не содержать инструкцию return. Ин_ струкция return была описана в главе 6; она прекращает выполнение функции и возвращает значение указанного в ней выражения (если оно есть) вызываю_ щей стороне; при отсутствии выражения инструкция возвращает значение unde_ fined. Если функция не содержит инструкцию return, она просто выполняет все инструкции в своем теле и возвращает неопределенное значение (undefined).
Пример 8.1. Определение JavaScript'функций
// Функция_обертка, иногда ее удобно использовать вместо document.write().
// В этой функции отсутствует инструкция return, поэтому она не возвращает значение. function print(msg)
{
document.write(msg, "<br>");
}
// Функция, вычисляющая и возвращающая расстояние между двумя точками.
function distance(x1, y1, x2, y2)
{
var dx = x2 _ x1; var dy = y2 _ y1;
return Math.sqrt(dx*dx + dy*dy);
}
// Рекурсивная функция (вызывающая сама себя), вычисляющая факториалы.
// Вспомните, что x! – это произведение x и всех положительных целых чисел, меньших х. function factorial(x)
{
if (x <= 1) return 1;
return x * factorial(x_1);
}
Будучи один раз определенной, функция может вызываться с помощью операто_ ра (), описанного в главе 5. Как вы помните, скобки указываются после имени функции, а необязательный список значений (или выражений) аргументов ука_ зывается в скобках через запятую (фактически перед круглыми скобками может указываться любое JavaScript_выражение, которое возвращает значение_функ_ цию). Функции, определенные в примере 8.1, могут быть вызваны следующим образом:
print("Вероятность этого равна: " + factorial(5)/factorial(13));
При вызове функции вычисляются все выражения, указанные между скобками, и полученные значения используются в качестве аргументов функции. Эти зна_ чения присваиваются параметрам, имена которых перечислены в определении функции, и функция работает с ними, ссылаясь на эти параметры по указанным именам. Обратите внимание: эти переменные_параметры определены, только
8.1. Определение и вызов функций
пока выполняется функция; они не сохраняются после завершения ее работы (за одним важным исключением, которое описывается в разделе 8.8).
JavaScript – язык с нестрогой типизацией, поэтому тип параметров функций указывать не требуется, и JavaScript не проверяет, соответствует ли тип данных требованиям функции. Если тип аргумента важен, вы можете проверить его са_ мостоятельно с помощью оператора typeof. Кроме того, JavaScript не проверяет, правильное ли количество параметров передано функции. Если аргументов больше, чем требуется функции, то дополнительные значения просто игнориру_ ются. Если аргументов меньше, то отсутствующим присваивается значение un_ defined. Некоторые функции написаны так, что могут достаточно терпимо отно_ ситься к нехватке аргументов, другие ведут себя некорректно, если получают меньшее число аргументов, чем предполагалось. Далее в этой главе мы познако_ мимся с приемом, позволяющим проверить, правильное ли количество аргумен_ тов передано в функцию, и организовать доступ к этим аргументам по их поряд_ ковым номерам в списке аргументов, а не по именам.
Обратите внимание: в функции print() из примера 8.1 нет инструкции return, по_ этому она всегда возвращает значение undefined, и использовать ее в качестве час_ ти более сложного выражения не имеет смысла. А функции distance() и facto_ rial() могут вызываться в более сложных выражениях, что было показано в пре_ дыдущих примерах.