P
prepair.app
Пройти интервью →
EnglishУкраїнськаРусский
🟨

Middle JavaScriptВопросы на собеседовании JavaScript

Middle · 2–4 года опыта

Собеседование по JavaScript крутится вокруг небольшого набора вещей, которые язык делает иначе, чем все остальные: замыкания, `this`, прототипы и event loop. Разберитесь с ними — и большинство остальных вопросов закроются сами. Ниже те, что задают чаще всего, каждый с эталонным ответом. Middle: более глубокое понимание, оптимизацию и реальные рабочие ситуации.

Темы для подготовки

Типы и приведение
Замыкания и области видимости
`this` и прототипы
Event loop и асинхронность
Промисы и async/await
DOM, события и браузер

6 вопросов уровня Middle с ответами

1

Приведите практическое применение замыкания и классический баг с ним.

Ответ

Практическое: счётчик или кэш, состояние которого не должно быть доступно снаружи, фабрика функций, вообще всё, что обязано помнить значение между вызовами. Классический баг — for (var i = 0; ...) setTimeout(() => console.log(i)), печатающий последнее значение каждый раз, потому что все колбэки замкнуты на одну привязку. let создаёт новую привязку на итерацию и это чинит.

2

Чем определяется `this` и что его ломает?

Ответ

Четыре правила по приоритету: new, затем явные call/apply/bind, затем вызов методом, где this — объект перед точкой, затем значение по умолчанию, то есть undefined в строгом режиме. Ломается он, когда метод передают как колбэк: к моменту вызова точки уже нет. Лечится bind в месте передачи, стрелочной обёрткой или объявлением метода полем класса.

3

Чем `class` отличается от функции-конструктора?

Ответ

Во время выполнения — почти ничем: class это синтаксис поверх того же механизма прототипов. Важны различия другого рода: тело класса всегда в строгом режиме, объявление класса нельзя использовать до него, методы неперечисляемы, а вызов класса без new бросает ошибку вместо тихого неверного поведения. extends и super действительно проще, чем связывать прототипы руками.

4

Каков порядок вывода и почему?

Ответ

Если в одном тике запланированы setTimeout(fn, 0) и .then уже разрешённого промиса, первым выполнится колбэк промиса. Причина в том, что после завершения текущего скрипта движок вычерпывает всю очередь микрозадач и только потом берёт одну макрозадачу из очереди таймеров. Отсюда следует, что микрозадача, планирующая новую микрозадачу, способна заблокировать отрисовку бесконечно, а setTimeout — нет.

5

Как выполнить асинхронную работу параллельно, а не последовательно?

Ответ

await внутри цикла последователен: каждая итерация ждёт предыдущую. Для параллельности сначала запускают все промисы, а потом ждут их вместе через Promise.all. allSettled берут, когда частичная неудача допустима, race — для таймаута, any — для первого успеха. Ошибка здесь превращает один запрос на 200 мс в двадцать запросов по 200 мс.

6

Отчего возникают утечки памяти в браузере и как их искать?

Ответ

Отсоединённые узлы DOM, на которые ещё держит ссылку JavaScript, неснятые обработчики, неочищенные таймеры и замыкания, удерживающие крупные объекты, плюс кэши, которые только растут. Ищут снимками кучи в DevTools до и после повторяемого действия со сравнением того, что выжило. WeakMap и WeakSet держат ключи слабо, поэтому именно они правильны для привязки данных к узлам DOM.

🦎

Прочитать ответы недостаточно

На собеседовании ты говоришь вслух под давлением. Кем задаст эти же вопросы, оценит каждый ответ и покажет, что именно подтянуть.

Пройти интервью Middle JavaScript →
Бесплатно · 3 интервью в месяц

Другие уровни — JavaScript

Junior JavaScriptSenior JavaScriptВсе вопросы JavaScript

Другие специализации

🔍Middle QA Manual🤖Middle QA AutomationMiddle Java Backend🐍Middle Python Backend🐘Middle PHP Backend🦫Middle Go Backend🟢Middle Node.js Backend💎Middle Ruby on Rails🔷Middle C++⚛️Middle React Frontend