
Функции в JavaScript – это блоки кода, которые можно вызывать многократно, передавая им аргументы и получая результаты. Их основное назначение – структурировать код и уменьшать повторяемость. Каждая функция может быть объявлена через function, присвоена переменной как функциональное выражение или создана с использованием стрелочной нотации (arrow function).
Аргументы функций позволяют динамически изменять поведение кода. JavaScript поддерживает параметры по умолчанию, REST-параметры и деструктуризацию объектов, что делает функции более гибкими и удобными для работы с массивами и объектами. Например, использование …args позволяет передавать любое количество аргументов без необходимости явного перечисления.
Возврат значений через return позволяет функциям быть вычислительными блоками. Функции без return возвращают undefined, что важно учитывать при обработке данных и построении цепочек вызовов. Асинхронные функции, обозначаемые ключевым словом async, возвращают Promise, упрощая работу с отложенными операциями.
Контекст выполнения функций определяется this. Для обычных функций this зависит от способа вызова, а стрелочные функции наследуют контекст внешней области видимости. Понимание этих нюансов критично для построения сложных интерфейсов и работы с объектами.
Разделение кода на мелкие функции улучшает читаемость и упрощает тестирование. Практика написания чистых функций без побочных эффектов повышает предсказуемость приложения и снижает количество багов. Использование модульного подхода позволяет комбинировать функции и создавать масштабируемые архитектуры.
Как объявлять функции и использовать их в коде

В JavaScript функции можно объявлять тремя основными способами: через ключевое слово function, функциональные выражения и стрелочные функции. Объявление через function выглядит так: function имяФункции(параметры) { /* тело функции */ }. Оно доступно во всём скрипте благодаря поднятию (hoisting), что позволяет вызывать функцию до её определения.
Функциональные выражения создаются с помощью присваивания функции переменной: const имяФункции = function(параметры) { /* тело */ };. Такой способ полезен, когда необходимо передавать функцию как аргумент другой функции или использовать её в замыкании.
Стрелочные функции имеют сокращённый синтаксис: const имяФункции = (параметры) => { /* тело */ };. Они не создают собственного контекста this, что упрощает работу с методами объектов и обработчиками событий.
При использовании функций важно точно определять параметры и возвращаемые значения. Для возврата значения используется return, например: function сумма(a, b) { return a + b; }. Если return отсутствует, функция возвращает undefined.
Функции можно вызывать напрямую: имяФункции(аргументы), или использовать как обработчики событий: element.addEventListener('click', имяФункции). Для повторного использования кода рекомендуется дробить логику на небольшие функции с одной задачей, что повышает читаемость и тестируемость.
Функции поддерживают вложенность. Внутри одной функции можно создавать другие функции, что создаёт замыкания. Они позволяют сохранять доступ к локальным переменным внешней функции даже после её завершения.
Для динамического поведения можно использовать параметры по умолчанию: function приветствие(имя = 'гость') { console.log('Привет, ' + имя); }. Это предотвращает ошибки при отсутствии аргументов.
Различия между function declaration и function expression

Function declaration создается с ключевым словом function в начале и имеет имя. Она поднимается (hoisted) в верхнюю часть своей области видимости, что позволяет вызывать функцию до её объявления:
Пример:
function sum(a, b) { return a + b; }
Функцию sum можно вызвать до её определения в коде, что облегчает структурирование больших скриптов.
Function expression создается присвоением функции переменной. Она может быть анонимной или именованной, но не поднимается полностью: вызов до определения вызовет ошибку ReferenceError или TypeError:
Пример:
const multiply = function(a, b) { return a * b; };
Function expression удобно использовать для динамического присваивания функций и передачи их как аргументы другим функциям.
Основные различия:
- Hoisting: function declaration поднимается полностью, function expression – только объявление переменной, но не саму функцию.
- Анонимность: function expression часто анонимна, function declaration всегда имеет имя.
- Контекст использования: function expression подходит для колбэков, замыканий и модулей; declaration лучше для основных функций, требующих раннего вызова.
Рекомендации: используйте function declaration для ключевых функций модуля и function expression для функций, которые передаются как аргументы или создаются условно.
Передача аргументов и работа с параметрами

Если аргументы не переданы, параметрам присваивается значение undefined. Для предотвращения ошибок можно задавать значения по умолчанию: function multiply(a = 1, b = 1) { return a * b; }. Это гарантирует корректную работу функции даже при неполном наборе аргументов.
JavaScript использует механизм передачи по значению для примитивов (числа, строки, логические значения) и по ссылке для объектов и массивов. Это означает, что изменение объекта внутри функции повлияет на исходный объект, а изменение числа или строки – нет.
Для работы с произвольным числом аргументов применяют оператор ...rest: function logAll(...args) { console.log(args); }. args будет массивом всех переданных значений, что удобно для обработки неизвестного количества параметров.
Методы arguments и rest схожи, но arguments не является полноценным массивом и не поддерживает современные функции высшего порядка напрямую. Предпочтительно использовать ...rest для чистого и понятного кода.
Проверка типов аргументов повышает надежность функций. Можно использовать typeof или встроенные проверки: if (typeof a !== "number") throw new Error("Ожидается число");. Это предотвращает непредвиденные ошибки при работе с данными.
Передача аргументов и грамотная работа с параметрами позволяет создавать гибкие, безопасные и легко расширяемые функции. Всегда учитывайте их количество, типы и возможные значения по умолчанию для предсказуемого поведения кода.
Возврат значений и управление результатами функции

Функция в JavaScript может возвращать значение с помощью ключевого слова return. Возвращаемое значение заменяет вызов функции, позволяя использовать результат напрямую в выражениях, присвоениях или других функциях.
Если return не указан, функция возвращает undefined. Это важно учитывать при логике обработки данных, чтобы не столкнуться с неожиданными результатами.
Пример использования возвращаемого значения для вычислений:
function multiply(a, b) { return a * b; }
let result = multiply(4, 5); // result = 20
Можно возвращать любые типы данных: числа, строки, объекты, массивы или даже другие функции. При возвращении объектов важно помнить, что изменения внутри объекта повлияют на исходный объект, если он передан по ссылке.
Функции могут использовать цепочку вызовов, когда результат одной функции передается другой:
function add(x, y) { return x + y; }
function square(n) { return n * n; }


