← Назад к вопросам

Какие знаешь типы объявления функций?

1.3 Junior🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы объявления функций в JavaScript

В JavaScript существует несколько способов объявления функций, каждый с уникальными характеристиками и применением.

Function Declaration (Объявление функции)

Function Declaration — это классический способ объявления функции с использованием ключевого слова function.

function greet(name) {
  return `Привет, ${name}!`;
}

console.log(greet("Мария")); // Привет, Мария!

Ключевые характеристики:

  • Hoisting: функция поднимается в верх области видимости и доступна ДО её объявления
  • Имеет имя (обязательно)
  • Полностью обработана перед выполнением кода
console.log(sayHello()); // "Hello!" — работает!
function sayHello() {
  return "Hello!";
}

Function Expression (Функциональное выражение)

Function Expression — функция, присвоенная переменной. Может быть именованной или анонимной.

// Анонимная функция
const add = function(a, b) {
  return a + b;
};

// Именованная функция (имя используется только внутри функции)
const multiply = function mul(a, b) {
  return a * b;
};

console.log(add(2, 3)); // 5

Ключевые характеристики:

  • НЕ hoisting: доступна только после объявления
  • Может быть анонимной
  • Код более явный и безопасный
console.log(subtract(5, 2)); // ReferenceError: subtract не определена

const subtract = function(a, b) {
  return a - b;
};

Arrow Function (Стрелочная функция)

Arrow Function — современный синтаксис ES6 для определения функций.

// Базовый синтаксис
const square = (x) => x * x;

// Без скобок для одного параметра
const double = x => x * 2;

// С несколькими параметрами
const divide = (a, b) => a / b;

// С телом функции
const calculate = (a, b) => {
  const sum = a + b;
  return sum * 2;
};

Ключевые характеристики:

  • Не имеют собственного контекста this (наследуют из родительской области)
  • Не имеют arguments (используй ...args)
  • Не могут быть конструкторами (нельзя использовать new)
  • Более компактный синтаксис
const user = {
  name: "Иван",
  greet: function() {
    // this указывает на объект user
    console.log(this.name);
  },
  greetArrow: () => {
    // this не указывает на user, это undefined (или window)
    console.log(this); // undefined или window
  }
};

Generator Function (Функция-генератор)

Generator Function — функция, которая может быть приостановлена и возобновлена.

function* generateNumbers() {
  yield 1;
  yield 2;
  yield 3;
}

const gen = generateNumbers();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }

Async Function (Асинхронная функция)

Async Function — функция для работы с асинхронным кодом и промисами.

async function fetchData() {
  try {
    const response = await fetch("/api/data");
    const data = await response.json();
    return data;
  } catch (error) {
    console.error("Ошибка:", error);
  }
}

// Async arrow function
const getData = async () => {
  const result = await fetch("/api");
  return result.json();
};

Сравнение типов

ХарактеристикаDeclarationExpressionArrowGeneratorAsync
HoistingДаНетНетНетНет
Имеет имяДаОпциональноНетДаДа
Свой thisДаДаНетДаДа
КонструкторДаДаНетНетНет
yieldНетНетНетДаНет
awaitНетНетДаДаДа

Когда использовать

  • Function Declaration: для основных функций, когда нужен hoisting
  • Function Expression: для коллбэков, когда нужна явность
  • Arrow Function: для коротких функций, когда важен контекст родителя
  • Generator: для итерирования по значениям
  • Async: для асинхронных операций

Выбор типа зависит от контекста и требований вашего кода.