---
title: Область видимости
seo:
  title: Область видимости — React Developer
  description: Тема «Область видимости» для собеседования React Developer. Что такое замыкание (Closures)? Что такое поднятие (Hoisting)?
---

[Все темы React Developer](/react-developer)

## <strong>Что такое замыкание (</strong><code>Closures</code><strong>)?</strong> [#q-14bee738d69b818fbadce9bfbed30d4b]

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

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Доступ к внешним переменным</strong>&#58;

    - Функция может сохранять доступ к переменным своей внешней функции.

    - Пример&#58;

        ```javascript
        function outerFunction() {
            let outerVariable = 'I am outside!';

            function innerFunction() {
                console.log(outerVariable);
            }

            return innerFunction;
        }

        const closure = outerFunction();
        closure(); // "I am outside!"
        ```

1. <strong>Приватные переменные</strong>&#58;

    - Замыкания могут использоваться для создания приватных переменных.

    - Пример&#58;

        ```javascript
        function createCounter() {
            let count = 0;

            return function() {
                count++;
                return count;
            };
        }

        const counter = createCounter();
        console.log(counter()); // 1
        console.log(counter()); // 2
        ```

Замыкания позволяют функции запоминать и получать доступ к переменным своей внешней функции, даже после завершения выполнения этой внешней функции.

:::note[Ссылки для изучения]

1. [Область видимости в JavaScript](https://learn.javascript.ru/closure)
   :::

---

## <strong>Что такое поднятие (</strong><code>Hoisting</code><strong>)?</strong> [#q-14bee738d69b81a5b90cf5644455c807]

Hoisting описывает создание привязок до выполнения соответствующих строк кода, а не буквальное перемещение исходного текста. var заранее получает undefined; объявления функций обычно доступны для вызова; let и const нельзя читать до инициализации из-за TDZ.

#### Основные характеристики&#58;

{/* prettier-ignore */}
1. <strong>Переменные</strong>&#58;

    - Объявления переменных (с <code>var</code>) поднимаются вверх, но их инициализация остается на месте.

    - Пример&#58;

        ```javascript
        console.log(x); // undefined
        var x = 5;
        ```

1. <strong>Функции</strong>&#58;

    - Объявления функций поднимаются полностью, включая тело функции.

    - Пример&#58;

        ```javascript
        greet(); // "Hello"
        function greet() {
            console.log("Hello");
        }
        ```

1. <code>let</code> <strong>и</strong> <code>const</code>&#58;

    - Переменные, объявленные с помощью <code>let</code> и <code>const</code>, также поднимаются, но они находятся в "временной мертвой зоне" (TDZ) до инициализации.

    - Пример&#58;

        ```javascript
        console.log(y); // ReferenceError
        let y = 10;
        ```

Hoisting описывает создание привязок до выполнения соответствующих строк кода, а не буквальное перемещение исходного текста. var заранее получает undefined; объявления функций обычно доступны для вызова; let и const нельзя читать до инициализации из-за TDZ.

:::note[Ссылки для изучения]

1. [Область видимости в JavaScript](https://learn.javascript.ru/closure)
   :::

---

## <strong>Что такое область видимости (</strong><code>Scope</code><strong>)?</strong> [#q-14bee738d69b81099598e895e94f8e08]

<strong>Область видимости (</strong>
<code>Scope</code>
<strong>)</strong> — это контекст, в котором определяются и доступны переменные
и функции в JavaScript.

#### Основные виды&#58;

{/* prettier-ignore */}
1. <strong>Глобальная область видимости</strong>&#58;

    - Переменные и функции, объявленные в глобальном контексте, доступны в любом месте кода.

    - Пример&#58;

        ```javascript
        var globalVar = "I'm global";

        function globalFunction() {
            console.log(globalVar);
        }
        ```

1. <strong>Функциональная область видимости</strong>&#58;

    - Переменные, объявленные внутри функции, доступны только внутри этой функции.

    - Пример&#58;

        ```javascript
        function myFunction() {
            var localVar = "I'm local";
            console.log(localVar);
        }
        // console.log(localVar); // Ошибка: localVar не определена
        ```

1. <strong>Блочная область видимости</strong>&#58;

    - Переменные, объявленные с помощью <code>let</code> и <code>const</code> внутри блока (<code>&#123;&#125;</code>), доступны только внутри этого блока.

    - Пример&#58;

        ```javascript
        {
            let blockVar = "I'm block-scoped";
            console.log(blockVar);
        }
        // console.log(blockVar); // Ошибка: blockVar не определена
        ```

Область видимости определяет контекст, в котором переменные и функции доступны для использования в JavaScript, обеспечивая контроль над видимостью и временем жизни данных.

:::note[Ссылки для изучения]

1. [Область видимости в JavaScript](https://learn.javascript.ru/closure)
   :::

---

## <strong>Какое значение имеет</strong> <code>this</code><strong>?</strong> [#q-14bee738d69b819dacbbe8dbe7c5392d]

<code>this</code> — это ключевое слово, которое ссылается на объект, к которому
принадлежит текущий контекст выполнения.

#### Основные контексты&#58;

{/* prettier-ignore */}
1. <strong>В глобальной области видимости</strong>&#58;

    - В обычном браузерном скрипте на верхнем уровне this равен window. В ES-модуле он равен undefined, а на верхнем уровне модуля CommonJS в Node.js обычно равен module.exports.

    - Пример&#58;

        ```javascript
        console.log(this); // В браузере выведет объект window
        ```

1. <strong>В методе объекта</strong>&#58;

    - При вызове obj.method() обычная функция получает obj как this. Если извлечь метод и вызвать отдельно, this определяется новым способом вызова, а не объектом, где функция хранилась.

    - Пример&#58;

        ```javascript
        const obj = {
            name: "Alice",
            getName: function() {
                return this.name;
            }
        };
        console.log(obj.getName()); // "Alice"
        ```

1. <strong>В конструкторах и классах</strong>&#58;

    - <code>this</code> ссылается на новый экземпляр объекта, создаваемый конструктором или классом.

    - Пример&#58;

        ```javascript
        function Person(name) {
            this.name = name;
        }
        const person = new Person("Bob");
        console.log(person.name); // "Bob"
        ```

1. <strong>В функциях-стрелках</strong>&#58;

    - Стрелочная функция не создаёт свой this, а использует его значение из окружающего лексического контекста. Это значение не меняют call, apply и bind.

    - Пример&#58;

        ```javascript
        const obj = {
            name: "Alice",
            getName: () => this.name
        };
        console.log(obj.getName()); // undefined, так как this ссылается на глобальный объект
        ```

Пример со стрелочной getName не читает obj.name. В браузерном скрипте он читает window.name; в ES-модуле обращение к this.name выбросит TypeError, потому что this равен undefined. Комментарий с undefined в примере не универсален.

:::note[Ссылки для изучения]

1. [Область видимости в JavaScript](https://learn.javascript.ru/closure)
   :::
