No Image

Javascript параметры функции по умолчанию

СОДЕРЖАНИЕ
5 просмотров
11 марта 2020

Ранее в этом учебнике вы узнали, что у функций могут быть параметры:

function имяФункции(параметр1, параметр2, параметр3) <
выполняемый код
>

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

При этом функции JavaScript не выполняют никакой проверки значений параметров (аргументов).

Правила параметров

  • Определение функции JavaScript не задает тип данных для параметров.
  • Функции JavaScript не проводят проверку типов переданных аргументов.
  • Функции JavaScript не проверяют количество полученных аргументов.

Параметры по умолчанию

Если функция вызывается с пропущенными аргументами (меньшим количеством параметров, чем декларировано в определении), то не заданные параметры устанавливаются в значение undefined.

Иногда это приемлемо, но иногда лучше присваивать параметру значение по умолчанию:

В ECMAScript 2015 допускает использование параметров по умолчанию в заголовке функции:

Если функция вызывается с лишними аргументами (большим количеством параметров, чем декларировано в определении), то доступ к этим аргументам можно получить через специальный объект arguments.

Объект Arguments

У всех функций JavaScript есть встроенный объект arguments, который называется объект аргументов.

Объект аргументов содержит массив всех аргументов, переданных в функцию при ее вызове.

Благодаря этому объекту, можно легко, например, найти максимальное значение в переданном в функцию списке чисел:

Или создать функцию для суммирования всех переданных значений:

Аргументы передаются по значению

Параметры в вызове функции — это аргументы функции.

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

Если функция изменит значение аргумента, то это не изменит оригинальное значение параметра.

Изменение аргумента не заметно (не отражается) за пределами функции.

Объекты передаются по ссылке

В JavaScript ссылки на объект являются значениями.

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

Изменение свойства объекта заметно (отражается) за пределами функции.

В этой статье вы узнаете, как работать с параметрами по умолчанию в JavaScript ES6.

Аргумент vs. параметров

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

Рассмотрим следующую функцию add_nums().

function add_nums(x,y) <
return x + y;
>

В этом примере x и y являются параметрами функции, а значения, которые мы передали функции add_nums() (330 и 120), являются аргументами.

Установка параметров JavaScript по умолчанию для функции.

В JavaScript параметр имеет значение по умолчанию undefined. Это означает, что если вы не передадите аргументы функции, его параметры будут иметь значения по умолчанию undefined.

function foo(bar) <
console.log(bar);
>

Функция foo() принимает параметр bar. Поскольку мы не передавали никаких аргументов при вызове функции foo(), значение аргумента bar не определено.

Предположим, вы хотите дать параметру bar значение по умолчанию 20. Типичная стратегия для достижения этого – проверить значение параметра и присвоить значение по умолчанию, если оно не определено.

function foo(bar) <
bar = typeof bar !== ‘undefined’ ? bar : 20;
console.log(bar);
>

В этом примере мы не присвоили значение параметру bar в вызове функции, поэтому его значение не определено. Однако внутри функции мы переопределили переменную bar значением 20, и так как ее значение не определено, скрипт выводит 20 в консоли.

В версии ES6 появился новый способ, обеспечивающий более простой способ установки значений по умолчанию для параметров функции, как показано в следующем примере:

Как ясно показано в приведенном выше примере, мы используем оператор присваивания (=) и значение по умолчанию после имени параметра.

function foo(bar = 10) <
console.log(bar);
>

foo(); // 10
foo(undefined); // 10
foo(20); //20

В первом вызове функции мы не передавали никаких аргументов функции foo(), поэтому параметр bar имеет значение по умолчанию 10. Во втором вызове функции мы передали undefined функции foo (), поэтому параметр bar также имеет значение по умолчанию 10. В третьем вызове мы передали значение по умолчанию 20 в функцию foo(), поэтому параметр bar принимает значение 20 в качестве значения.

Читайте также:  Как включить автоматические точки восстановления

На этом все, а в следующей статье мы продолжим обсуждать тему параметров по умолчанию в JavaScript.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 0 ):

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Зачастую нам надо повторять одно и то же действие во многих частях программы.

    Например, необходимо красиво вывести сообщение при приветствии посетителя, при выходе посетителя с сайта, ещё где-нибудь.

    Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.

    Примеры встроенных функций вы уже видели – это alert(message) , prompt(message, default) и confirm(question) . Но можно создавать и свои.

    Объявление функции

    Для создания функций мы можем использовать объявление функции.

    Пример объявления функции:

    Вначале идёт ключевое слово function , после него имя функции, затем список параметров в круглых скобках через запятую (в вышеприведённом примере он пустой) и, наконец, код функции, также называемый «телом функции», внутри фигурных скобок.

    Наша новая функция может быть вызвана по её имени: showMessage() .

    Вызов showMessage() выполняет код функции. Здесь мы увидим сообщение дважды.

    Этот пример явно демонстрирует одно из главных предназначений функций: избавление от дублирования кода.

    Если понадобится поменять сообщение или способ его вывода – достаточно изменить его в одном месте: в функции, которая его выводит.

    Локальные переменные

    Переменные, объявленные внутри функции, видны только внутри этой функции.

    Внешние переменные

    У функции есть доступ к внешним переменным, например:

    Функция обладает полным доступом к внешним переменным и может изменять их значение.

    Внешняя переменная используется, только если внутри функции нет такой локальной.

    Если одноимённая переменная объявляется внутри функции, тогда она перекрывает внешнюю. Например, в коде ниже функция использует локальную переменную userName . Внешняя будет проигнорирована:

    Переменные, объявленные снаружи всех функций, такие как внешняя переменная userName в вышеприведённом коде – называются глобальными.

    Глобальные переменные видимы для любой функции (если только их не перекрывают одноимённые локальные переменные).

    Желательно сводить использование глобальных переменных к минимуму. В современном коде обычно мало или совсем нет глобальных переменных. Хотя они иногда полезны для хранения важнейших «общепроектовых» данных.

    Параметры

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

    В нижеприведённом примере функции передаются два параметра: from и text .

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

    Вот ещё один пример: у нас есть переменная from , и мы передаём её функции. Обратите внимание: функция изменяет значение from , но это изменение не видно снаружи. Функция всегда получает только копию значения:

    Читайте также:  Прочтите следующие записи заменив символические обозначения

    Параметры по умолчанию

    Если параметр не указан, то его значением становится undefined .

    Например, вышеупомянутая функция showMessage(from, text) может быть вызвана с одним аргументом:

    Это не приведёт к ошибке. Такой вызов выведет "Аня: undefined" . В вызове не указан параметр text , поэтому предполагается, что text === undefined .

    Если мы хотим задать параметру text значение по умолчанию, мы должны указать его после = :

    Теперь, если параметр text не указан, его значением будет "текст не добавлен"

    В данном случае "текст не добавлен" это строка, но на её месте могло бы быть и более сложное выражение, которое бы вычислялось и присваивалось при отсутствии параметра. Например:

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

    В примере выше anotherFunction() будет вызываться каждый раз, когда showMessage() вызывается без параметра text .

    Ранние версии JavaScript не поддерживали параметры по умолчанию. Поэтому существуют альтернативные способы, которые могут встречаться в старых скриптах.

    Например, явная проверка на undefined :

    …Или с помощью оператора || :

    Возврат значения

    Функция может вернуть результат, который будет передан в вызвавший её код.

    Простейшим примером может служить функция сложения двух чисел:

    Директива return может находиться в любом месте тела функции. Как только выполнение доходит до этого места, функция останавливается, и значение возвращается в вызвавший её код (присваивается переменной result выше).

    Вызовов return может быть несколько, например:

    Возможно использовать return и без значения. Это приведёт к немедленному выходу из функции.

    В коде выше, если checkAge(age) вернёт false , showMovie не выполнит alert .

    Если функция не возвращает значения, это всё равно, как если бы она возвращала undefined :

    Пустой return аналогичен return undefined :

    Для длинного выражения в return может быть заманчиво разместить его на нескольких отдельных строках, например так:

    Код не выполнится, потому что интерпретатор JavaScript подставит точку с запятой после return . Для него это будет выглядеть так:

    Таким образом, это фактически стало пустым return .

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

    И тогда всё сработает, как задумано.

    Выбор имени функции

    Функция – это действие. Поэтому имя функции обычно является глаголом. Оно должно быть простым, точным и описывать действие функции, чтобы программист, который будет читать код, получил верное представление о том, что делает функция.

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

    Например, функции, начинающиеся с "show" обычно что-то показывают.

    Функции, начинающиеся с…

    • "get…" – возвращают значение,
    • "calc…" – что-то вычисляют,
    • "create…" – что-то создают,
    • "check…" – что-то проверяют и возвращают логическое значение, и т.д.

    Примеры таких имён:

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

    Функция должна делать только то, что явно подразумевается её названием. И это должно быть одним действием.

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

    Несколько примеров, которые нарушают это правило:

    • getAge – будет плохим выбором, если функция будет выводить alert с возрастом (должна только возвращать его).
    • createForm – будет плохим выбором, если функция будет изменять документ, добавляя форму в него (должна только создавать форму и возвращать её).
    • checkPermission – будет плохим выбором, если функция будет отображать сообщение с текстом доступ разрешён/запрещён (должна только выполнять проверку и возвращать её результат).

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

    Читайте также:  Мегашара зеркало сайта как зайти

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

    Например, во фреймворке jQuery есть функция с именем $ . В библиотеке Lodash основная функция представлена именем _ .

    Это исключения. В основном имена функций должны быть в меру краткими и описательными.

    Функции == Комментарии

    Функции должны быть короткими и делать только что-то одно. Если это что-то большое, имеет смысл разбить функцию на несколько меньших. Иногда следовать этому правилу непросто, но это определённо хорошее правило.

    Небольшие функции не только облегчают тестирование и отладку – само существование таких функций выполняет роль хороших комментариев!

    Например, сравним ниже две функции showPrimes(n) . Каждая из них выводит простое число до n .

    Первый вариант использует метку nextPrime :

    Второй вариант использует дополнительную функцию isPrime(n) для проверки на простое:

    Второй вариант легче для понимания, не правда ли? Вместо куска кода мы видим название действия ( isPrime ). Иногда разработчики называют такой код самодокументируемым.

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

    Итого

    Объявление функции имеет вид:

    • Передаваемые значения копируются в параметры функции и становятся локальными переменными.
    • Функции имеют доступ к внешним переменным. Но это работает только изнутри наружу. Код вне функции не имеет доступа к её локальным переменным.
    • Функция может возвращать значение. Если этого не происходит, тогда результат равен undefined .

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

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

    • Имя функции должно понятно и чётко отражать, что она делает. Увидев её вызов в коде, вы должны тут же понимать, что она делает, и что возвращает.
    • Функция – это действие, поэтому её имя обычно является глаголом.
    • Есть много общепринятых префиксов, таких как: create… , show… , get… , check… и т.д. Пользуйтесь ими как подсказками, поясняющими, что делает функция.

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

    Задачи

    Обязателен ли "else"?

    Следующая функция возвращает true , если параметр age больше 18 .

    В ином случае она запрашивает подтверждение через confirm и возвращает его результат:

    Будет ли эта функция работать как-то иначе, если убрать else ?

    Есть ли хоть одно отличие в поведении этого варианта?

    Оба варианта функций работают одинаково, отличий нет.

    Перепишите функцию, используя оператор ‘?’ или ‘||’

    Следующая функция возвращает true , если параметр age больше 18 .

    В ином случае она задаёт вопрос confirm и возвращает его результат.

    Перепишите функцию, чтобы она делала то же самое, но без if , в одну строку.

    Сделайте два варианта функции checkAge :

    1. Используя оператор ?
    2. Используя оператор ||

    решение

    Используя оператор || (самый короткий вариант):

    Обратите внимание, что круглые скобки вокруг age > 18 не обязательны. Они здесь для лучшей читаемости кода.

    Функция min(a, b)

    Напишите функцию min(a,b) , которая возвращает меньшее из чисел a и b .

    Вариант решения с использованием if :

    Вариант решения с оператором ? :

    P.S. В случае равенства a == b не имеет значения, что возвращать.

    Функция pow(x,n)

    Напишите функцию pow(x,n) , которая возвращает x в степени n . Иначе говоря, умножает x на себя n раз и возвращает результат.

    Создайте страницу, которая запрашивает x и n , а затем выводит результат pow(x,n) .

    Комментировать
    5 просмотров
    Комментариев нет, будьте первым кто его оставит

    Это интересно
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    No Image Компьютеры
    0 комментариев
    Adblock
    detector