Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 565
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США25 642
  • Вакансии в Европе10 259
  • Работа в России3 639
  • Вакансии в Канаде2 255

По формату

  • Удалённые вакансии42 339
  • Релокация в США25 642
  • Гибридная работа5 706
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме JavaScriptВсе вопросы
JavaScriptMiddleТеория

Объясните понятие closure в JavaScript. Как closure может вызвать утечку памяти?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Замыкание — функция, которая запоминает переменные из внешней области видимости. Утечка памяти возникает, когда замыкание удерживает ссылку на большой объект (DOM-узел, данные) дольше, чем нужно.

Что такое замыкание

Замыкание (closure) возникает, когда внутренняя функция обращается к переменным из внешней функции после того, как внешняя уже завершила выполнение. Движок сохраняет ссылку на лексическое окружение (scope), не давая сборщику мусора удалить переменные.

function makeCounter(start = 0) {
  let count = start; // переменная живёт в замыкании
  return {
    increment() { return ++count; },
    decrement() { return --count; },
    value()     { return count; },
  };
}

const c = makeCounter(10);
c.increment(); // 11
c.increment(); // 12
c.value();     // 12
// count недоступен снаружи, но живёт, пока жив объект c

Практические применения

// 1. Частичное применение / каррирование
const add = (a) => (b) => a + b;
const add5 = add(5);
add5(3); // 8

// 2. Приватное состояние модуля (Module Pattern)
const store = (() => {
  let state = {};
  return {
    get: (key) => state[key],
    set: (key, val) => { state[key] = val; },
    reset: () => { state = {}; },
  };
})();

// 3. Мемоизация
function memoize(fn) {
  const cache = new Map();
  return function (...args) {
    const key = JSON.stringify(args);
    if (cache.has(key)) return cache.get(key);
    const result = fn.apply(this, args);
    cache.set(key, result);
    return result;
  };
}

Утечки памяти через замыкания

Утечка возникает, когда замыкание удерживает ссылку на большой объект, а сам callback/обработчик остаётся зарегистрированным после ненужности.

// Плохо: DOM-узел и data живут, пока жив обработчик
function setupLeak() {
  const hugeData = new Array(100_000).fill('x');
  const el = document.getElementById('btn');

  el.addEventListener('click', function handler() {
    console.log(hugeData.length); // замыкание держит hugeData
    // handler никогда не удаляется!
  });
}

// Хорошо: явно удаляем обработчик
function setupClean() {
  const hugeData = new Array(100_000).fill('x');
  const el = document.getElementById('btn');

  function handler() {
    console.log(hugeData.length);
    el.removeEventListener('click', handler); // однократный обработчик
  }
  el.addEventListener('click', handler);
  // или: el.addEventListener('click', handler, { once: true });
}

// Утечка через setInterval
function intervalLeak() {
  const bigObject = { data: new Array(50_000).fill(0) };
  const id = setInterval(() => {
    console.log(bigObject.data.length); // bigObject никогда не GC
  }, 1000);
  // Нет clearInterval — bigObject держится вечно
  return id; // вызывающий должен сохранить и вызвать clearInterval
}

Диагностика утечек в Chrome DevTools

  • Вкладка Memory → Heap snapshot: сделать снимок до и после действия, сравнить retained size.
  • Allocation timeline: найти объекты, которые растут и не освобождаются.
  • Фильтр по типу: искать Detached HTMLElement — узлы, удалённые из DOM, но удерживаемые замыканием.

Подводные камни

  • Цикличные ссылки: объект ссылается на замыкание, замыкание на объект — до ES6 это гарантировало утечку в старых IE; в современных движках mark-and-sweep справляется, но в WeakMap/WeakRef-сценариях важно понимать граф ссылок.
  • Замыкание в цикле with var: классический баг — все callback-и делят одну переменную i. Решение: let или IIFE.
  • Большой внешний объект в маленькой функции: даже если замыканию нужна одна строка из объекта, держится весь объект — деструктурируйте нужное.
  • Таймеры без clearInterval/clearTimeout: timer callback держит весь внешний scope до очистки.
  • Обработчики событий на глобальных объектах: window.addEventListener, document.addEventListener — живут весь жизненный цикл страницы.
  • React useEffect без cleanup: подписка без возврата функции очистки держит ссылки на state и props старого рендера.
  • WebSocket / EventSource: если соединение не закрывается при unmount компонента, замыкание с callback удерживает DOM и данные.
  • Скрытые замыкания в Promise chain: незавершённые promise-цепочки удерживают весь контекст создания — убедитесь, что промисы завершаются или отменяются (AbortController).

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

  • Смешивать «closure» с похожим механизмом без критерия выбора.
  • Игнорировать риск: неверно оценить границы применения темы «closure» и получить хрупкое решение.
  • Показывать только синтаксис и не объяснять поведение в runtime или сборке.

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

  • Объясняет лексическое окружение функции и риск удержания лишних объектов в памяти.
  • Показывает на примере, как работает: замыкание хранит ссылки на переменные внешней области, поэтому callback, таймер или обработчик события может продлить жизнь большого объекта после ухода компонента со страницы.
  • Называет production-нюанс и граничный случай для темы «closure».

Как вы знаете этот вопрос?

Проверить себя по теме JavaScript →

Источники

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Memory_management
←Предыдущий вопросКак работает event loop в JavaScript? Что такое call stack и task queue?Следующий вопрос→Что такое async/await и как это связано с Promise под капотом?

Связанные темы

JavaScriptjavascript-runtimeperformance-debugging

Вакансии с этим навыком

JavaScript вакансии
  • Middle/Senior Full-Stack Python Engineer (Django) (#5841)
  • Senior .NET Fullstack Engineer( With Angular) (#5846)
  • Junior Frontend Developer
  • Front-End Developer
  • Senior Java FullStack Developer (React)

Частые вопросы на собеседовании

  • Как защититься от XSS в браузерном приложении? Где помогают CSP, escaping и Trusted Types?
  • В чём разница между var, let и const? Как hoisting влияет на каждое из них?
  • Что такое Promise? Чем они отличаются от callback'ов?
  • Для каких задач JavaScript является сильным выбором, а где лучше честно выбрать другой язык?