Главная Категории Контакты Поиск

Контекст выполнения и лексическая среда в JavaScript

Что такое контекст выполнения и лексическая среда.

JavaScript ·03.12.2019·читать 3 мин 🤓·Автор: Alex Myzgin

Контекст выполнения (Execution Context)

Контекст выполнения - это среда, в которой выполняется оценка текущего кода.

Так как Javascript является однопоточным (single-threaded), в любой момент времени может быть запущен только один контекст выполнения!

Каждый раз, когда запускаем функцию, мы добавляем скобки {}, а затем выполняем или запускаем её.

// глобальный контекст выполнения

function printMyName () {
    // новый контекст выполнения
    return `Alex`;
}

function sayMyName () {
    // новый контекст выполнения
    return printMyName();
}

sayMyName();

// глобальный контекст выполнения

Как только движок JavaScript увидит эти скобки {}, он создаст контекст выполнения.

Первое, что сделает движок JavaScript - создаст глобальный контекст выполнения, и тем самым даст нам две вещи: глобальный объект (global object), и ключевое слово this. В браузере глобальный объект и this являются window.

window === this // true

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

Если мы используем что-то вроде NodeJS, глобальный объект не будет window. Вместо этого он будет называться global.

Поэтому, как только в нашем движке JavaScript будет сделана первая фаза - фаза создания, наступит вторая - фаза исполнения, в которой мы, фактически, запустим наш код.

Лексическая среда (Lexical Environment)

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

Каждый раз, когда мы создаем контекст выполнения, он проверяет, где были написаны слова (функции) и их местоположение.

Если у нас функция, которая объявлена внутри другой функции printMyName, вторая функция написана в другой лексической среде - лексической среды первой функции printMyName.

// глобальная лексическая среда
function printMyName() {
    // лексическая среда функции printMyName
    function() {
        console.log('Alex')
    }
}

Лексическая среда означает место, где написан код, во время компиляции. И в зависимости от того, когда компилятор или интерпретатор увидит наш код, он будет знать разные вещи об этом коде.

Мне нравится думать об этом так: в javascript каждый раз, когда у нас есть функция, она создает для нас новый “мир” внутри этой функции. Мы попадаем в этот “мир” каждый раз, когда добавляем его в стек вызовов, и внутри этого “мира” мы можем делать разные вещи, иметь разную информацию. Также, эти “миры” могут общаться друг с другом по-разному.

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

Лексическая среда - это место, в котором написан код. Таким образом лексическая область (lexical scope), представляет собой доступные данные и переменные, для которых была определена функция. То есть то место, где мы пишем функцию, определяет являются ли доступные ей переменные. Так что важно где мы создаем функцию, а не где мы её вызываем.

Заключение

  • лексическая среда означает, место где код был написан;
  • глобальная среда является родительской средой для всех других сред, созданных в коде;
  • в браузере глобальная среда называется window;
  • в NodeJS глобальная среда называется global.

Website, name & logo
Copyright © 2019. Alex Myzgin