Функции
Чтобы не повторять один и тот же код во многих местах, придуманы функции. Функции являются основными «строительными блоками» программы.
*DRY – Don't Repeat Yourself (Не повторяй себя)*
Пример объявления функции:
Возвращаемое значение
Мы можем воспринимать функцию как некоторую фабрику которая что-то получает и выдает какой-то результат своей работы.
Чтобы вернуть результат из функции используется оператор return
.
Важно заметить, что вернуть результат из функции вы можете только один раз.
Вызов функции является выражением, Т.е имеет значение... это значение можно присвоить в переменную
Всплытие функций (hoisting)
Более детально мы будем обсуждать функции потом, справка будет расширена. Но пока можно обратить внимание на этот пример:
Следует быть аккуратными с подобными эффектами, многие считают такое поведение опасным, поэтому следует сначала объявить функцию, а потом только вызывать ее.
Рекурсия
С рекурсией все просто... это возможность из функции foo вызывать саму себя функцию foo.
Напишем рекурсивную функцию, которая будет выводить в консоль числа от 0 до 100:
*Стоит заметить, что этот пример сложнее чем использование циклов, сделан от только для примера*
Живой пример
Рекурсия / Введение в программирование, урок 8 (JavaScript ES6)
Объявление Function Expression
Существует альтернативный синтаксис для объявления функции, который ещё более наглядно показывает, что функция – это всего лишь разновидность значения переменной.
Мы в переменную foo
присваиваем функцию... в дальнейшем мы поймем, что это приводит нас к тому, что функции в JS это элементы первого порядка.
Анонимная функция – функция у которой нет собственного имени, в примере ниже, вы можете сказать, что функция имеет имя foo. Но это не совсем так, в переменной лежит анонимная функция.
*Смотря на пример выше мы должны вспомнить про всплытие переменных и функций*
Самовызывающиеся функции
Мы с вами уже увидели, что объявление функции может являться выражением. Выражения можно заключать в круглые скобки (Пример: (10 + 3) * 2
). Давайте сделаем так: (function (){...})()
.
Что за ужас мы сделали?
Мы объявили функцию в круглых скобках, потом из круглых скобок мы ее получили и вызвали. Т.к функции имеют свою область видимости переменных таким образом мы можем изолировать какие-то переменные в нашем модуле.
Callback function и передача функции как аргумент
Выше уже говорилось о том, что функции являются элементами первого класса, в первую очередь это обозначает, что функции можно передавать как аргументы в другие функции или методы. Результатом работы одной функции может быть другая функция.
Замыкания
Замыкания многих пугают в этом языке... хотя они существуют и в других языках тоже. Замыкание – это возможность запоминать контекст при котором была создана функция. После создания функция имеет доступ к переменным которые были доступны на момент создания.
Для наглядность давайте еще попробуем написать функцию-счетчик
Псевдомассив аргументов "arguments"
warning
TODO: Дописать
Живой пример с счетчиком