Call Stack Flashcards

1
Q

Что такое стек вызовов’1?

‘1 call stack

A

Стек вызовов - это упорядоченная структура данных для хранения информации об активных процессах выполняемой программы.
Основное предназначение стека вызовов - установить порядок передачи управления от завершенного активного процесса другому процессу.
В ECMAScript стек вызовов называется стеком контекстов выполнения’1.

Execution contexts

‘1 execution contexts

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое контекст выполнения?

A

Контекст выполнения - это механизм для отслеживания выполнения кода в ECMAScript.
В любой момент времени в работающем Агенте существует максимум один активный контекст выполнения.
Контексты выполнения формируют стек контекстов выполнения.
Новый контекст выполнения создается автоматически, когда управление передается от исполняемого кода, связанного с активным контекстом выполнения, исполняемому коду, который с ним. Новый контекст выполнения устанавливается в верхушке стека и становится активным.

Execution contexts

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Из каких компонентов состоит контекст выполнения?

Опишите 7 компонента

A

Каждый контекст выполнения хранит состояние из 4 основных компонентов:
1. Статус выполнения кода
2. Является ли код функцией
3. Область из которой коду доступны ресурсы
4. Скрипт или модуль

Контекст выполнения ECMAScript хранит состояние из 3 дополнительных компонентов:
1. Лексическое окружение‘1 - объект окружения’2, которое используется для разрешения обращения по идентификаторам, созданным в рамках текущего контекста выполнения
2. Окружение переменных‘3 - объект окружения, которое содержит ссылки по идентификаторам, созданными с применением инструкций объявления переменных
3. Частное окружение‘4 содежит частные наименования классов

Execution contexts

‘1 Lexical environment
‘2 Environment record
‘3 Variable environment
‘4 Private environment

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что такое объект окружения?

A

Объект окружения - это тип спецификации, который используется для создания связи идентификаторов с переменными и функциями. Обычно объект окружения связан с такими синтатическими структурами, как объявление функции, инструкция блока, catch из инструкции Try и др. Каждый раз, когда такой код исполняется, создается новый объект окружения.
В каждом объекте окружения хранится ссылка на внешний объект окружения, в рамках которого он был создан.
Объект окружения подразделяется типы:
1. Декларативный объект хранит связи, созданные с помощью const, let, class, import и др. Также подразделяется на объекты окружения функции и модуля.
2. Объект окружения объекта
3. Глобальный объект окружения

Environment records

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что содержит объект окружения функции?

A

Объект окружения функции - декларативный объект. Соответвенно, он хранит связи идентификаторов в своей области видимости на верхнем уровне функции, а также, если он не является объектом окружения стрелочной фнукции, хранит связь идентификатора this и состояние для выполнения метода super.
При создании контекста выполнения функции для нее создается объект окружения, который заполняется параметрами, объявленными переменными, остальные идентификаторы заполняются по мере исполнения кода функции.

Function environment records

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что содержит объект окружения модуля?

A

Объект окружения функции - декларативный объект. Соответвенно, он хранит связи идентификаторов в своей области видимости на верхнем уровне модуля. Внешний объект окружения модуля - глобальный объект.

Module environment records

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что содержит глобальный объект окружения?

A

Глобальный объект окружения представляет собой окружение наивысшего порядка, к которому есть доступ у всех элементов программы.

Global environment records

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Что такое замыкание’1?

‘1 closure

A

При попытке обращения по идентификатору запись с соответствующим ему значением сначала разыскивается в текущем объекте окружения, затем в объектах окружения, в рамках которых он был создан.
При необходимости возможно присвоить значение дочернего объекта окружения идентификатору родительского. Это поведение принято называть замыканием.
В случае завершения функции уничтожается контекст выполнения, но связка идентикиатора со значением в объекте останется до уничтожения родительского объект окружения.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Напишите пример замыкания.

RunJS

A
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) // замыкание через присваивание
How well did you know this?
1
Not at all
2
3
4
5
Perfectly