← Назад к вопросам

Какой объект считается достижимым?

1.7 Middle🔥 121 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое достижимый объект в JavaScript?

В контексте JavaScript и управления памятью, достижимый объект — это объект, который может быть доступен прямо или косвенно из так называемого корня (root), и, следовательно, он не будет удален сборщиком мусора (Garbage Collector). Достижимость — фундаментальное понятие для понимания работы автоматического управления памятью в JavaScript-движках.

Корни достижимости (Roots)

Корни — это специальные объекты или ссылки, которые изначально считаются достижимыми. Типичные корни включают:

  • Глобальный объект (в браузере это window, в Node.js — global).
  • Активный контекст выполнения и его локальная область видимости (например, переменные и параметры внутри выполняющейся функции).
  • Ссылки на другие достижимые объекты (например, свойства объектов, элементы массива).

Как определяется достижимость: алгоритм пометок

Движок JavaScript (например, V8) использует алгоритм Mark-and-Sweep ("Пометка и очистка"). Его работа упрощенно выглядит так:

  1. Пометка (Mark): Сборщик мусора начинает обход от корней и помечает все объекты, до которых можно добраться. Если объект доступен из корня (напрямую или через цепочку ссылок), он помечается как "достижимый".
  2. Очистка (Sweep): Все непомеченные (недостижимые) объекты считаются мусором и удаляются из памяти. Их занимаемое пространство освобождается.

Примеры достижимых и недостижимых объектов

Рассмотрим на практических примерах.

Пример 1: Простая достижимость

// user ссылается на объект -> объект достижим из глобальной области (корня)
let user = { name: "Alice" };

// Достижимость через цепочку ссылок
let admin = user; // Теперь admin тоже ссылается на тот же объект
user = null;      // Разрываем одну ссылку
// Объект { name: "Alice" } все еще достижим через ссылку `admin`!

Пример 2: Объект становится недостижимым (мусором)

function createUser() {
    let tempUser = { name: "Bob" }; // Объект достижим из локальной переменной tempUser (корень - контекст функции)
    return tempUser;
}

let externalRef = createUser(); // externalRef теперь ссылается на объект { name: "Bob" }
// После завершения функции tempUser уничтожается, но объект остается достижимым через externalRef.

externalRef = null; // Теперь НИЧТО не ссылается на объект { name: "Bob" }
// Он становится недостижимым и будет удален сборщиком мусора.

Пример 3: Взаимные ссылки и изолированные острова (Islands)

Иногда объекты ссылаются друг на друга, но от корня до них добраться невозможно. Такой "остров" объектов тоже становится мусором.

function createIsland() {
    let objA = { name: "A" };
    let objB = { name: "B" };
    objA.ref = objB; // objA ссылается на objB
    objB.ref = objA; // objB ссылается на objA (циклическая ссылка)
    return; // Функция завершается, локальные переменные objA и objB уничтожаются
}
createIsland();
// Несмотря на взаимные ссылки, objA и objB больше НЕ ДОСТУПНЫ из глобального контекста.
// Весь этот "остров" объектов будет корректно удален сборщиком мусора.

Практические следствия для разработчика

Понимание достижимости помогает писать более эффективный и стабильный код:

  • Утечки памяти часто возникают, когда объект непреднамеренно остается достижимым. Типичные сценарии:
    *   **Неудаленные обработчики событий** или таймеры, ссылающиеся на DOM-элементы.
    *   **Замыкания**, сохраняющие ссылки на большие объекты дольше необходимого.
    *   **Кеши**, которые никогда не очищаются.
  • Для явного обрыва ссылок иногда используют null или undefined.
  • Современные инструменты разработчика в браузерах (Chrome DevTools, Firefox Developer Tools) имеют Profiler и Memory tabs, которые помогают отслеживать утечки, показывая цепочки достижимости объектов.

Итог: Достижимый объект — это объект, который может быть достигнут из активного контекста выполнения или глобальной области видимости через цепочку ссылок. Только недостижимые объекты удаляются сборщиком мусора, что делает автоматическое управление памятью возможным в JavaScript.