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