> Какие есть способы объявления функций в JavaScript и их особенности (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Иннотех, YADRO, Kvando Technologies, IT-One, GoInvest, ООО Рокет Тех, TYMY, SmartWay

Стек: JavaScript

> Пример ответа

Короткий ответ

Основные способы: function declaration, function expression, arrow functions, методы в объектах и классах, а также функции через конструктор new Function. Ключевые различия - hoisting, привязка this, наличие собственного arguments и возможность использования как конструктора. Function declaration поднимается целиком, arrow functions не имеют своего this и не могут быть конструкторами, function expression создаётся в момент выполнения кода.

Подробное объяснение

Function declaration - классическое объявление через function name() {}. Особенность: полный hoisting, то есть функцию можно вызвать до её объявления в коде. Имеет собственный this, arguments, super, может использоваться с new.

Function expression - присваивание анонимной или именованной функции переменной. Создаётся в момент выполнения строки, поэтому до этой строки недоступна. Именованные function expression полезны для рекурсии и отладки - имя видно только внутри самой функции.

Arrow functions - синтаксис () => {}. Не имеют собственного this (берут из лексического окружения), нет arguments, нельзя использовать как конструктор, нет prototype. Не подходят для методов объектов, если нужен доступ к this объекта, но идеальны для колбэков, где важно сохранить контекст.

Методы в объектах и классах - сокращённый синтаксис { method() {} } и class A { method() {} }. В классах методы не перечисляемы, работают в strict mode, имеют собственный this, но не имеют prototype (в отличие от методов, объявленных через function expression внутри класса).

new Function - создаёт функцию из строки кода. Работает в глобальной области видимости, не видит локальные переменные, выполняется медленнее из-за парсинга. Используется крайне редко, в основном для динамической генерации кода.

На практике

Для колбэков и функционального программирования - arrow functions, они короче и не создают проблем с this. Для методов объектов - обычные функции или сокращённый синтаксис, иначе потеряете контекст. Для рекурсивных функций - именованные function expression или function declaration. Для конструкторов - только function declaration или expression, но не arrow.

Важно помнить про hoisting при организации кода: function declaration можно вызывать до объявления, это удобно для модульной структуры, но может скрывать ошибки порядка инициализации. Arrow functions лишены этой проблемы - они ведут себя как обычные переменные.

Пример кода

JAVASCRIPT
// Function declaration - hoisting работает
console.log(sum(2, 3)); // 5
function sum(a, b) { return a + b; }
// Function expression - до объявления недоступна
// console.log(multiply(2, 3)); // ReferenceError
const multiply = function(a, b) { return a * b; };
// Arrow function - нет своего this
const obj = {
value: 42,
regular: function() { return this.value; },
arrow: () => this.value // undefined или глобальный this
};
// Именованная function expression для рекурсии
const factorial = function fact(n) {
return n <= 1 ? 1 : n * fact(n - 1);
};
// Метод в объекте
const user = {
name: 'Alice',
greet() { return `Hi, ${this.name}`; }
};
// new Function - редкий случай
const dynamic = new Function('a', 'b', 'return a + b');

Как отвечать на собеседовании

Начните с перечисления всех способов, затем сгруппируйте по ключевым отличиям: hoisting, this, arguments, конструктор. Приведите примеры, когда какой способ предпочтителен. Упомяните edge cases: arrow functions в методах объектов, именованные function expression для рекурсии, разницу между function и => в обработчиках событий. Если спросят про производительность - отметьте, что разница минимальна, важнее семантика. Покажите понимание, почему arrow functions не подходят для методов, которым нужен динамический this.

Что проверяет интервьюер

  • Понимание hoisting и его последствий для разных типов объявлений.
  • Знание контекста this и лексической области видимости.
  • Умение выбирать правильный синтаксис под задачу.
  • Понимание ограничений arrow functions (не конструктор, нет arguments).
  • Знание тонкостей: именованные function expression, методы в классах, new Function.

Типичные ошибки

  • Утверждение, что arrow functions - просто синтаксический сахар, без упоминания this и arguments.
  • Использование arrow function как метода объекта, когда нужен this объекта.
  • Забывают, что function expression не hoistится, и пытаются вызвать до объявления.
  • Путают именованные function expression с function declaration.
  • Не упоминают, что методы в классах не имеют prototype и работают в strict mode.
  • Считают, что new Function - нормальный инструмент, не упоминая проблемы безопасности и производительности.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью