Пока коды, которые мы пишем, работают, в фоновом режиме есть процессы, которые мы не видим. Когда механизм Javascript считывает и выполняет коды, он делает это в 2 этапа. Этот общий процесс, называемый контекстом выполнения, состоит из 2 этапов, как мы уже упоминали, как этап создания и этап выполнения.
На первом этапе, называемом этап создания, JS-движок выполняет некоторую работу по ознакомлению с кодом и подготовке. Создает контекст, выделяет память для хранения переменных и функций. На следующем этапе, который является этапом выполнения, механизм JS присваивает значения, которые мы упомянули, переменным, с которыми он уже знаком, и вызывает функции.
Мы можем сравнить это с приготовлением пищи. С самого начала мы узнаем, какие аксессуары необходимы для еды, которую мы собираемся приготовить (фаза создания).
Затем определяем количество припасов и начинаем действие по приготовлению еды (фаза исполнения).
Когда код выполняется в первый раз, сначала создается глобальный контекст выполнения и выполняются указанные этапы. Затем, если функции существуют и вызываются, создаются функциональные контексты выполнения и выполняются обе фазы.
Мы можем практически увидеть все это с кодом ниже.
- Когда этот код считывается движком, сначала создается глобальный контекст.
1.1 — Во время фазы создания, которая является 1-й фазой глобального контекста, в памяти будет выделено место для переменных и функции, а затем им будут присвоены начальные значения, как показано на слева в приведенной выше таблице. На этом этапе также создается глобальный объект, и этот объект равен объекту window (если это веб-браузер) в глобальном контексте создания.
1.2 — Затем фаза выполнения, который является второй фазой глобального контекста. На этом этапе движок уже ознакомится со значениями, которые мы присваиваем переменным, которые он размещает, как показано в таблице справа.
2. Если вы заметили, с переменной tech в функции getTechStack ничего не делалось. Это связано с тем, что переменная находится внутри функции getTechStack. После вызова этой функции, как в строке 9, будет создан новый функциональный контекст, и в этом контексте снова будут выполнены 2 фазы. Только в этом случае переменная tech будет рассматриваться как любая другая переменная.
В отличие от глобального контекста, глобальный объект в функциональном контексте будет эквивалентен объекту arguments, который ссылается на параметры функции.
Таким образом, каждый раз, когда вызывается функция, отличная от глобального контекста, будет создан новый контекст и будет повторяться одна и та же процедура.
Спасибо, что прочитали. :)
Другие темы: