Call Stack Flashcards
Что такое стек вызовов’1?
‘1 call stack
Стек вызовов - это упорядоченная структура данных для хранения информации об активных процессах выполняемой программы.
Основное предназначение стека вызовов - установить порядок передачи управления от завершенного активного процесса другому процессу.
В ECMAScript стек вызовов называется стеком контекстов выполнения’1.
‘1 execution contexts
Что такое контекст выполнения?
Контекст выполнения - это механизм для отслеживания выполнения кода в ECMAScript.
В любой момент времени в работающем Агенте существует максимум один активный контекст выполнения.
Контексты выполнения формируют стек контекстов выполнения.
Новый контекст выполнения создается автоматически, когда управление передается от исполняемого кода, связанного с активным контекстом выполнения, исполняемому коду, который с ним. Новый контекст выполнения устанавливается в верхушке стека и становится активным.
Из каких компонентов состоит контекст выполнения?
Опишите 7 компонента
Каждый контекст выполнения хранит состояние из 4 основных компонентов:
1. Статус выполнения кода
2. Является ли код функцией
3. Область из которой коду доступны ресурсы
4. Скрипт или модуль
Контекст выполнения ECMAScript хранит состояние из 3 дополнительных компонентов:
1. Лексическое окружение‘1 - объект окружения’2, которое используется для разрешения обращения по идентификаторам, созданным в рамках текущего контекста выполнения
2. Окружение переменных‘3 - объект окружения, которое содержит ссылки по идентификаторам, созданными с применением инструкций объявления переменных
3. Частное окружение‘4 содежит частные наименования классов
‘1 Lexical environment
‘2 Environment record
‘3 Variable environment
‘4 Private environment
Что такое объект окружения?
Объект окружения - это тип спецификации, который используется для создания связи идентификаторов с переменными и функциями. Обычно объект окружения связан с такими синтатическими структурами, как объявление функции, инструкция блока, catch
из инструкции Try
и др. Каждый раз, когда такой код исполняется, создается новый объект окружения.
В каждом объекте окружения хранится ссылка на внешний объект окружения, в рамках которого он был создан.
Объект окружения подразделяется типы:
1. Декларативный объект хранит связи, созданные с помощью const
, let
, class
, import
и др. Также подразделяется на объекты окружения функции и модуля.
2. Объект окружения объекта
3. Глобальный объект окружения
Что содержит объект окружения функции?
Объект окружения функции - декларативный объект. Соответвенно, он хранит связи идентификаторов в своей области видимости на верхнем уровне функции, а также, если он не является объектом окружения стрелочной фнукции, хранит связь идентификатора this
и состояние для выполнения метода super
.
При создании контекста выполнения функции для нее создается объект окружения, который заполняется параметрами, объявленными переменными, остальные идентификаторы заполняются по мере исполнения кода функции.
Что содержит объект окружения модуля?
Объект окружения функции - декларативный объект. Соответвенно, он хранит связи идентификаторов в своей области видимости на верхнем уровне модуля. Внешний объект окружения модуля - глобальный объект.
Что содержит глобальный объект окружения?
Глобальный объект окружения представляет собой окружение наивысшего порядка, к которому есть доступ у всех элементов программы.
Что такое замыкание’1?
‘1 closure
При попытке обращения по идентификатору запись с соответствующим ему значением сначала разыскивается в текущем объекте окружения, затем в объектах окружения, в рамках которых он был создан.
При необходимости возможно присвоить значение дочернего объекта окружения идентификатору родительского. Это поведение принято называть замыканием.
В случае завершения функции уничтожается контекст выполнения, но связка идентикиатора со значением в объекте останется до уничтожения родительского объект окружения.
Напишите пример замыкания.
const f1 = () => { let obj = null const f2 = () => { const obj1 = { o: 1 } const obj2 = { o: 2 } const obj3 = { o: 3 } obj = obj1 globalThis.obj = obj2 return obj3 } const result = f2() console.log('f2', result) // замыкание через return console.log('obj', obj) // замыкание через присваивание } f1() console.log('global', obj) // замыкание через присваивание