Функции
В JavaScript функция — это не просто блок кода, а полноценное значение и одновременно объект: её можно присвоить переменной, передать в другую функцию, вернуть и хранить в коллекции. Именно из этого свойства вырастает почти всё остальное в этой теме — колбэки, функции высшего порядка, фабрики функций и модульный паттерн.
Три механизма JavaScript, связанные с функциями, стабильно валят кандидатов. Первый — замыкание: функция помнит переменные области, где была создана, даже после её завершения. Второй — привязка this: она определяется тем, как функцию вызвали, а не где написали. Третий — стрелочные функции, у которых нет своего this и arguments. Разберите каждый механизм в слоях ниже — там же лежат call/apply/bind, bound-функции и исторический IIFE.
Карта темы
- Функции первого класса — функция как значение: присвоить, передать, вернуть, хранить.
- Функции высшего порядка — функции, принимающие или возвращающие другие функции, и почему
map/filter/reduce— их примеры. - Замыкания — функция в связке с лексическим окружением, приватное состояние и баг захвата в цикле.
- Привязка this — четыре правила разрешения
thisпо месту вызова и их приоритет. - Стрелочные функции — краткий синтаксис без своего
this,arguments,newиprototype. - call, apply, bind — явная установка
this: немедленный вызов против отложенной привязки. - Bound-функции — что именно возвращает
bindи какnewперебивает привязанныйthis. - IIFE — немедленно вызываемое выражение-функция и приватная область до эпохи
let/constи модулей.
Частые ошибки и ловушки
| Ошибка | Последствие |
|---|---|
Считать this привязанным в месте определения | В колбэке obj.method теряется this, метод падает или пишет в глобал |
| Думать, что замыкание копирует переменные | Все колбэки цикла с var видят одно финальное значение (баг захвата) |
| Использовать стрелку как метод объекта | this берётся из внешней области, а не из obj — часто undefined |
Путать call и apply | apply принимает массив аргументов, call — список; перепутанный вызов ломает передачу |
Ждать, что bind вызовет функцию сразу | bind только возвращает новую функцию; тело не выполняется |
| Считать функции высшего порядка рекурсией | Рекурсия и вложенность ни при чём — важен приём или возврат функции |
Значение для собеседований
Функции — базовый блок JavaScript-секции интервью, и по ним быстро видно глубину. Кандидат, который говорит «this определяется местом вызова, а стрелка берёт его лексически», сразу опережает того, кто заучил «стрелка — это короткая запись функции».
Что обычно проверяют:
- Что значит «функция первого класса» и как из этого следуют колбэки и функции высшего порядка.
- Определение замыкания через живую ссылку на лексическое окружение, а не копию; баг захвата в цикле и как его чинит
let. - Четыре правила
thisи их приоритет; чем стрелка отличается от обычной функции. - Разница
call/apply/bindи что возвращаетbind.
Типичный неверный ответ: «замыкание — это снимок-копия переменных в момент создания функции». На самом деле замыкание держит живую ссылку на окружение: изменения внешних переменных видны внутренней функции, и именно поэтому цикл с общей var-привязкой выдаёт баг захвата.