> Какие есть способы объявления функций в 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)); // 5function sum(a, b) { return a + b; }// Function expression - до объявления недоступна// console.log(multiply(2, 3)); // ReferenceErrorconst multiply = function(a, b) { return a * b; };// Arrow function - нет своего thisconst 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- нормальный инструмент, не упоминая проблемы безопасности и производительности.
> Похожие задачи по frontend
В чем разница контекста this в стрелочной и декларативной функции в JavaScript?
Что такое call, apply и bind в JavaScript и в чем их разница
Что такое область видимости (scope) в JavaScript
Что такое Map и Set в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью