Выбрать главу

Начнем с простого и знакомого примера:

alert("my argument");

Перед нами функция alert. Вероятно, мы уже видели ее пару-тройку (или несколько десятков) раз. Суть в том, что в эту функцию передается так называемый аргумент, который описывает то, что требуется отобразить при вызове. На рис. 3.8 показано, что отобразится на экране, если вызвать функцию alert с аргументом myargument.

Аргумент — это то, что находится между открывающими и закрывающими скобками. Функция alert — лишь одна из множества возможных функций, принимающих аргументы. Многие из функций, которые вы создадите в будущем, будут также принимать аргументы.

В этой главе мы рассматривали еще одну функцию, принимающую аргументы, а именно showDistance:

function showDistance(speed, time) {

alert(speed * time);

}

Рис. 3.8. Отображение аргумента

Понять, что функция принимает аргументы, можно, просто взглянув на ее описание (объявление):

function showDistance(speed, time) {

alert(speed * time);

}

То, что ранее было пустыми скобками после имени функции, теперь содержит информацию о количестве аргументов, необходимых функции, а также подсказывает, какие значения заданы этим аргументам.

В случае с showDistance можно сделать вывод о том, что эта функция принимает два аргумента. Первый из них соответствует speed (скорости), а второй — time (времени).

Мы задаем значения аргументов в рамках вызова функции:

function showDistance (speed, time) {

alert(speed * time);

}

showDistance(10, 5);

В нашем случае мы вызываем функцию showDistance и задаем значения, которые хотим в нее передать, внутри скобок (рис. 3.9).

Поскольку мы передаем больше одного аргумента, то перечисляем значение каждого через запятую. И пока я не забыл, отмечаю еще один важный момент: важен порядок, в котором вы определяете аргументы.

showDistance(10, 5);

Рис. 3.9. Значения, которые мы хотим передать в функцию

Давайте рассмотрим этот процесс подробнее и начнем с диаграммы на рис. 3.10.

Рис. 3.10. Диаграмма вызова функции

Для вызова в функцию showDistance передается 10 как аргумент для speed и 5 — для time. Изображенный на диаграмме перенос полностью основан на последовательности.

Как только передаваемые значения достигают функции, определенные для аргументов имена начинают обрабатываться как имена переменных (рис. 3.11).

Рис. 3.11. Имена аргументов работают как переменные

Мы можем использовать эти имена переменных, чтобы легко и без забот ссылаться на значения, содержащиеся в аргументах внутри функции.

Несоответствие числа аргументов

Если вы не задаете аргументы при вызове или задаете меньше или больше аргументов, чем требуется функции, все по-прежнему может работать. Чтобы избежать подобных ситуаций, вы можете применять защитное программирование, и в дальнейшем мы рассмотрим этот вопрос подробнее.

В целом, чтобы создать код с более четкой структурой, необходимо передавать в функцию соответствующее число аргументов.

Создание функции, возвращающей результат

Последний вид функции, который мы рассмотрим, — это та функция, которая возвращает результат в ответ на вызов. Вот, что нам нужно сделать. У нас есть функция showDistance, которая, как нам прекрасно известно, выглядит так:

function showDistance(speed, time) {

alert(speed * time);

}

Нам нужно, чтобы наша функция не вычисляла расстояние и отображала его в виде уведомления, а сохраняла полученное значение для дальнейшего использования. Мы хотим получить примерно следующее:

let myDistance = showDistance(10, 5);

Переменная myDistance будет содержать результат вычисления, которое выполнит функция showDistance.

Ключевое слово return

Возврат данных из функции производится посредством ключевого слова return. Давайте создадим новую функцию с именем getDistance, которая будет выглядеть как showDistance, но отличаться в том, что происходит при выполнении функции до завершения:

function getDistance(speed, time) {

let distance = speed * time;

return distance;

}

Обратите внимание, что мы вычисляем расстояние, умножая speed на time. Вместо отображения уведомления (alert) мы возвращаем значение расстояния (которое содержится в переменной distance).

Мы можем выполнить вызов функции getDistance в рамках инициализации переменной:

let myDistance = getDistance(10, 5);

Когда функция getDistance будет вызвана, она выполнит вычисление и вернет численное значение, которое затем будет присвоено переменной myDistance. И всего делов-то!