☕ Что в коробке? Как работают функции в JavaScript
Знакомимся с фундаментальным строительным блоком любого приложения на JavaScript — функцией.
Что такое функция
Функция — это блок программы, который выполняет определенное действие, например, возводит в степень или складывает значения.
Представьте, что функция — это коробка, и мы не знаем, что внутри нее. Мы только знаем, что она может делать. И когда нам надо совершить какое-либо действие, мы помещаем значения в эту коробку и она выполняет всю работу.
Результат действия функции можно применить в любом месте программы.
Как объявить функцию
Функция объявляется с помощью команды function
. После чего мы именуем функцию и в скобках записываем ее параметры.
Синтаксис такой:
Например, функция, которая вызывает предупреждение:
Как вызвать функцию
Функцию вызывают по имени. Например, чтобы вызывать функцию из нашего примера, нужно после функции написать showAlert();
Параметры и аргументы
Аргументы
Функции можно задать сколько угодно параметров, а потом передать им любые значения. Функция сама поймет, что необходимо сделать с этими значениями.
Например:
В примере мы используем два параметра: from
и text
. Затем в теле функции соединяем from + ', ' + text
. А снаружи функции присваиваем им аргументы и выводим на экран.
Передачи одной функции в другую
В функцию можно передать значение другой функции. Например:
В примере задано две функции:
getDomNodesBySelector
— преобразует найденные селекторы на веб странице в массив.applyDiscount
— считает какую-то величину и берет данные для этого из функцииgetDomNodesBySelector
.
Колбэки
Строки кода в языке JavaScript выполняются по очереди. Например:
Но бывают такие случаи, когда нам необходимо отсрочить функцию one()
, чтобы первой выполнилась two()
. Для этого можно использовать setTimeout
.
Например:
Вызов функции с отсрочкой называется колбэк (callback
).
Колбэк передают в виде параметра. Например:
Функция myHomework
имеет два параметра subject
и callback
.
Затем мы вызываем параметр subject
, а параметр callback
вызовем функцией myHomeworkFinished
.
Когда код выполнится, появятся два предупреждения: Starting my math homework
и Finished my homework
.
Локальные переменные
Локальные переменные видны только внутри тела функции. За пределами функции эти переменные уже не работают.
Например:
В примере мы попытались вывести значение переменной message
двумя способами: внутри функции путем вызова самой функции и путем вызова самой переменной.
В первом случае — получаем результат работы функции.
Во втором случае — получаем ошибку, потому что переменную видно только внутри функции.
Внешние переменные
Давайте возьмем пример выше. Оставим внутри функции значение переменной message
. А за пределами функции заведем другую переменную и назовем ее message
.
В коде у нас две переменные с одинаковым именем. Но наш сценарий будет считать их разными переменными.
В первом случае переменная будет видна программе только внутри функции showMessage()
, во втором случае переменная будет видна всей программе.
Параметры по умолчанию
Когда мы указали параметр и не присвоили ему аргумент, то его значение будет undefined
.
Например:
В примере параметру text
мы не передали значение аргумента. Поэтому в результате мы видим аргумент параметра from
и undefined
.
Возврат значения
Вернуть значение функции можно с помощью директивы return
в теле функции. Например, напишем функцию, которая складывает два параметра.
В примере мы говорим функции, что необходимо возвращать сумму значений аргументов с помощью директивы return
.
Необходимо помнить, что после return
выполнение операций в функции прекращается. Поэтому, с помощью return
можно прерывать функции.
Функция, которая возвращает функцию
Функцию из предыдущего примера можно записать так:
Что мы сделали:
- Создали переменную
generateSumFinder
и присвоили ей значение стрелочной функции. Когда мы видим значок=>
, перед нами стрелочная функция. - Внутри функции создали переменную
sum
. Это локальная переменная и видна только внутри функции и присвоили ей значение стрелочной функции, которая складывает аргументыa
иb.
- Вернули переменную
sum
. - За пределами функции создали переменную
sum
. Это внешняя переменная и она не зависит от переменной внутри функции. Этой переменной мы присвоили значение функцииgenerateSumFinder
.
Рекурсия
В рекурсии функция вызывает саму себя. Рекурсия достигается за счет конструкции if…else
. Чтобы применить рекурсию нужно определить базовый и рекурсивный случай. Функция будет вызывать саму себя, пока результат не приведет к базовому случаю. В других случаях будет выполняться рекурсивный случай.
Например:
Функция будет вызываться каждый раз, пока значение ее параметра i
больше 1
– это рекурсивный случай. Или вызывается при базовом случае при i<=1
.
Перегрузка функций в JavaScript
У перегруженных функций одинаковые имена, но разные параметры. JavaScript не поддерживает перегрузку.
Например:
Несмотря на то, что в первой функции один параметр, вывод аргументов этой функции выведет два параметра. Как вы помните, второй ее параметр будет undefined
.
В JavaScript есть способы, как перегрузить функцию. Для этого используют метод arguments.length
.
Например:
В примере с помощью метода arguments.length
мы узнаем количество параметров в функции и выводим столько параметров, сколько аргументов мы задаем.
Выбор имени функции
Чтобы выбрать имя функции, необходимо следовать правилам:
Использовать слова на английском языке
неправильно | правильно |
pokazatSoobsheniye | showMessage |
Использовать глаголы, потому что функция – это действие
неправильно | правильно |
Message (сообщение) | showMessage (показать сообщение) |
Комментарии в функции
Комментарии нужны, чтобы кто-то кроме вас понимал, что происходит в функции.
Например:
Замыкания
Замыкание – это функция, которая запоминает свои внешние переменные и может получить к ним доступ. В JavaScript все функции являются замыканиями. Замыкания позволяют функции работать с внешними переменными, даже если они изменились.
Например:
В примере функция sayHi()
будет оперировать со вторым значением переменной name
. Таким образом, функция замыкает свое действие на известной переменной, где бы не задали ее значение.
Приведем еще один пример:
В примере функция makeWorker()
замыкается на внутренней переменной name = "Nikolay"
. Поэтому при инициализации переменных, следует обращать внимание, какая функция будет ими пользоваться и на какой из них будет замыкаться.
Стрелочные функции
Функцию можно задать не только с помощью слова function
. Есть способ короче, для этого используют значок =>
.
Например:
Если параметр в функции один, то скобки можно не писать.
Например:
Если параметров нет, то пишут круглые скобки.
Например:
Лексика this
В стрелочных функциях нет лексики this.
Если происходит обращение к this
, его значение берется снаружи.
Например:
Функции используются, чтобы они выполняли любые действия. Функции позволяют разбить код на блоки, исходя из логики программы. Чтобы овладеть написанием функций, необходимо понимать принципы их работы:
- видимость переменных;
- параметры и аргументы;
- стрелочные функции;
- лексика this;
- замыкания;
- рекурсия;
- колбэки.