| Функции JavaScript |
|
| Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||
|
[Определение функции на JavaScript] Существует 6 основных способов определения функций в языке JavaScript. Понимание их различий критически важно, так как они влияют на объект this, возможность вызова до объявления (hoisting) и область видимости. Вот полный обзор от самых старых до самых современных способов: 1. Function Declaration (объявление функции) Классический способ. Такие функции поднимаются (hoisting) в начало своей области видимости, поэтому их можно вызывать до того, как они написаны в коде. // Вызов ДО объявления работает, ошибки нет: console.log(sum(5, 3)); // 8 2. Function Expression (функциональное выражение) Функция записывается как значение переменной. Не поднимается в начало модуля — вызвать её можно только после присваивания. // Вызов ДО объявления вызовет ошибку (ReferenceError) 3. Arrow Functions (стрелочные функции) — современный стандарт Самый популярный способ в современном коде. Короткий синтаксис и, самое главное, не имеют своего this (берется его из внешнего контекста). // Если тело в одну строку, return и фигурные скобки можно опустить 4. Function Constructor Создает функцию из строки. Используется крайне редко (из-за проблем с безопасностью и производительностью), но полезен для динамической генерации кода. const dynamicFunc = new Function('a', 'b', 'return a + b'); console.log(dynamicFunc(1, 2)); // 3 5. Метод объекта (shorthand method) Краткая запись для функций внутри объектов. const user = { 6. Генераторы (function*) Особый тип функций, которые можно приостанавливать и возвращать несколько значений за время выполнения (используются с yield). function* idGenerator() { Ключевые отличия способов определения функций JavaScript:
Совет по выбору: 1. Используйте Function Declaration, когда нужно объявить глобальную утилиту, которая будет использоваться по всему скрипту. [Способы возврата значений из функции] В JavaScript функции всегда возвращают значение. Если вы явно ничего не пишете, они возвращают undefined. Существует 3 основных способа вернуть значение, и один особый случай, который ломает шаблоны (генераторы). Давайте разберем их по порядку. 1. Явный возврат (ключевое слово return) Самый очевидный способ возврата. Как только интерпретатор встречает return, выполнение функции немедленно прекращается, а значение из return отправляется наружу. function greet(name) { Важный нюанс: если написать return без значения, то функция вернет undefined. function test() { 2. Неявный возврат (только для стрелочных функций) Это фишка стрелочных функций. Если убрать фигурные скобки `{ }`, то return ставится автоматически, а функция возвращает результат вычисления выражения. // Короткая запись — неявный возврат 3. Возврат через Callback (асинхронный возврат) В классическом JavaScript нельзя "вернуть" данные из асинхронной операции (например, запроса к серверу) через return, потому что код выполняется не по порядку. Вместо этого данные передаются в так называемую функцию обратного вызова (callback). function fetchData(callback) { 4. Особый случай: генераторы (yield вместо return) Функции-генераторы (function*) используют оператор yield. Он не завершает функцию, а лишь приостанавливает её, возвращая промежуточное значение. Чтобы получить следующее значение, нужно вызвать next() снова. function* counter() { Что происходит, если ничего не возвращать? Любая функция в JS по умолчанию возвращает undefined. Это не ошибка, а стандартное поведение. function doNothing() { Главные правила, которые стоит запомнить:
Совет для современного кода. Сейчас принято использовать return + Promise (или async/await) вместо callback-функций. Это позволяет работать с асинхронными данными как с обычными: async function fetchModern() { [Параметры функции] Ниже приведен обзор использования параметров функции JavaScript. 1. Базовый синтаксис function sum(a, b) { 2. Параметры по умолчанию (ES6) function greet(name = "Гость") { Можно использовать выражения: function multiply(a, b = a * 2) { 3. Остаточные параметры (rest parameters) — `...` Следующее определение функции собирает все лишние аргументы в массив: function sumAll(...numbers) { С другими параметрами: function show(first, second, ...rest) { 4. Объект arguments (устаревший) Доступен только внутри обычных функций (не стрелочных): function oldSum() { В современном коде используйте `...rest` вместо `arguments`. 5. Деструктуризация параметров Объекты: function showUser({ name, age, city = "Не указан" }) { Массивы: function getFirst([first, second]) { 6. Передача по значению vs по ссылке Примитивы (числа, строки, булевы) — копируются: function change(x) { Объекты и массивы — передаются по ссылке: function changeObj(obj) { Чтобы не мутировать исходный объект — создавайте копию: function safeUpdate(obj) { 7. Проверка наличия аргументов function test(a, b) { 8. Стрелочные функции и параметры // Один параметр — скобки можно опустить 9. Типизация параметров (JSDoc) Для документации и подсказок в IDE: /** 10. Примеры распространённых паттернов Функция с опциями: function fetchData(url, options = {}) { Callback-параметры: function process(items, callback) { Шпаргалка:
|