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

Мой заголовок в значительной степени суммирует все это.

Может ли кто-нибудь просветить меня о...

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

и как это связано с "этим", подъемом, цепочкой прототипов, областью видимости и сборкой мусора?

10 ответов

Решение

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


Контекст выполнения - это понятие в спецификации языка, которое, с точки зрения непрофессионала, примерно соответствует "среде", в которой выполняется функция; то есть область видимости переменных (и цепочка областей видимости, переменные в замыканиях из внешних областей), аргументы функций и значение this объект.

Стек вызовов - это коллекция контекстов выполнения.

Смотрите также этот ответ и эту статью.


Область действия буквально такова: область, в которой можно получить доступ к переменной. Упрощенно:

var x;

function a() {
    var y;
}

x можно получить доступ из любого места. когда a вызывается, x будет во внешнем объеме. (Хранится в цепочке объема.)

По сравнению, y можно получить только по коду в a() потому что это ограничено aСфера. Это то, что var Ключевое слово делает: ограничивает переменную локальной областью. Если мы опускаем var, y в конечном итоге в глобальном масштабе, как правило, считается плохой вещью.


Думайте о поднятии как о чем-то большем во время компиляции. В JavaScript объявления функций "поднимаются" до вершины своей области видимости. Другими словами, они анализируются и оцениваются перед любым другим кодом. (Это противоположно функциональным выражениям, которые оцениваются внутри строки.) Рассмотрим следующее:

a();
b();

function a() { }
var b = function() { }

Призыв к a() будет успешным, потому что его объявление было поднято наверх; a был назначен автоматически до начала выполнения программы. Призыв к b() потерпит неудачу с TypeError так как b не будет определен до строки 4.

Вы задали так много понятий, но давайте выберем одно за другим и поймем их.

Среда, в которой работает ваш код Execution context , Он создается, когда ваш код выполняется.

Execution Context (Global) созданный JS Engine содержит 3 важных для вас вещи:

  1. Глобальный объект - window
  2. Специальный объект this
  3. Ссылка на внешнюю среду

Давайте посмотрим на простой пример, чтобы понять Global Execution Context:

var a = "Hello World";

function b(){

}

Когда JS Engine запускает приведенный выше код, он создает следующий контекст выполнения (показанный на рисунке): Глобальный контекст выполнения


Теперь давайте посмотрим, как JS Engine создает Execution Context (тогда мы выкопаем и поймем подъем): рассмотрим этот сценарий:

b();
console.log(a);

var a = "Hello World!";
function b(){
    console.log("Called b!");
}

Я могу вызвать функцию b() хотя это будет объявлено позже. Это означает, что JS Engine делает что-то перед выполнением моего кода, давайте посмотрим, что:

JS Engine выполняет следующие два шага при выполнении любого кода:

ФАЗА СОЗДАНИЯ:

  • Парсинг JS Engine - беги через твой код identifies variables & functions созданный кодом (который будет использоваться на этапе выполнения)
  • Установка пространства памяти для переменных и функций - "Подъем"
  • Подъем - перед выполнением вашего кода JS Engine выделяет пространство памяти для Var & Func, используемого внутри кода. Эти переменные и функции составляют контекст выполнения любой функции, которая должна быть выполнена. Все переменные в JS изначально установлены как неопределенные.

ФАЗА исполнения: довольно проста для понимания,

  • Когда код выполняется построчно (через JS-интерпретатор), он может получить доступ к переменным, определенным в контексте выполнения.
  • назначение переменных выполняется на этом этапе

Новый контекст выполнения создается при каждом вызове функции

Стек контекста выполнения: что происходит, когда вы вызываете функцию:

function b(){

}

function a(){
    b();
}

a();
  • Сейчас в первую очередь Global Execution Context будет создан (как объяснено выше)

  • затем начинается выполнение и встречаются переводчики call to function a(), а также here a new execution context is created pushed on top EC Stack

    поэтому каждый раз, когда вы вызываете функцию, новый EC создается и помещается поверх стека EC.

  • а сейчас EC for a() является CREATED Интерпретатор выполнит код внутри a() построчно

  • тогда встреча с предпринимателем call to function b() это создает другое EC который выдвигается сверху или EC стек

  • когда b() заканчивается он будет вытолкнут стека тогда a() закончится и вплоть до Global EC

см. стек выполнения для приведенного выше фрагмента кода

Я хотел бы обратиться

  1. контекст
  2. этот контекст (связь с контекстом)
  3. Объем

1: контекст выполнения

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

Именно здесь часто возникает путаница, термин " контекст исполнения" фактически для всех намерений и целей относится скорее к сфере, а не к контексту. Это неудачное соглашение об именах, однако это терминология, определенная спецификацией ECMAScript, так что мы немного застряли с ней.

Каждый раз, когда создается новый контекст выполнения, он добавляется к вершине стека выполнения. Браузер всегда будет выполнять текущий контекст выполнения, который находится поверх стека выполнения. После завершения он будет удален из верхней части стека, и управление вернется в контекст выполнения ниже.

Контекст выполнения может быть разделен на этап создания и выполнения. На этапе создания интерпретатор сначала создает переменный объект (также называемый объектом активации), который состоит из всех переменных, объявлений функций и аргументов, определенных в контексте выполнения. Оттуда цепочка областей действия инициализируется следующим, и значение этого определяется последним. Затем на этапе выполнения код интерпретируется и выполняется.

2: этот контекст

Что такое "этот" контекст? Контекст чаще всего определяется тем, как вызывается функция. Когда функция вызывается как метод объекта, это устанавливается для объекта, для которого вызывается метод:

var obj = {
    foo: function() {
        return this;   
    }
};

obj.foo() === obj; // true

Тот же принцип применяется при вызове функции с оператором new для создания экземпляра объекта. Когда вызывается таким образом, значение этого в рамках функции будет установлено на вновь созданный экземпляр:

function foo() {
    alert(this);
}

foo() // window
new foo() // foo

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

3: Переменная область

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

В ECMAScript 6 (ES6/ES2015) введены ключевые слова let и const, которые поддерживают объявление локальных переменных области видимости блока. Это означает, что переменная будет ограничена областью действия блока, в котором она определена, например оператором if или циклом for, и не будет доступна вне открывающих и закрывающих фигурных скобок блока. Это противоречит объявлениям var, которые доступны вне блоков, в которых они определены. Разница между let и const заключается в том, что объявление const, как следует из названия, является константой - ссылка только для чтения на значение. Это не означает, что значение является неизменным, просто то, что идентификатор переменной не может быть переназначен.

Для других тем: GC: GC Prototyping: прототипирование

Я затронул только темы, которые наиболее тесно связаны.

Контекст выполнения - это оболочка вокруг существующего кода; который содержит код, который вы не написали; но генерируется движком JS.

Он состоит из следующего -

  1. Глобальный объект
  2. 'этот'
  3. Внешняя среда
  4. Ваш код

Контекст выполнения создается каждый раз, когда вы запускаете файл / приложение.js. Первый шаг на этом этапе создания - Подъем. JS Engine резервирует пространство или установочную память для всех переменных и функций, определенных в вашем коде. Затем они доступны, когда ваш код выполняется построчно.

Например:

b();
console.log(a);
var a = "hi!";
function b() {
    console.log("calling function");
}

Здесь к функции b() и переменной a обращаются до того, как они определены, однако из-за подъема консоли не будет выдано никакой ошибки.

Вывод будет выглядеть - (попробуйте)

calling function
undefined

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

Я надеюсь, что это проясняет концепцию для вас.

Когда вы выполняете функцию, вы создаете новый execution context содержащая локальную память, которая называется variable environment а также this который является заполнителем, он будет ссылаться внутри своего контекста выполнения на все, что находится слева от . где вызывается эта функция.

"Контекст выполнения" - это зонтик, который оборачивает весь код, помогая управлять им. Это как менеджер, который управляет любой средой. Поскольку существует очень много лексических сред, потому что в приложении JavaScript у вас много переменных и функций, вам нужен способ управлять всем. Что идет первым, что идет вторым и так далее, и если у вас не было среды "контекста выполнения", все идет к черту. Итак, рассмотрите "Контекст выполнения" как обертку, управляющую вашим кодом.

Недавно я изучил глобальную переменную контекста выполнения и функцию. Поэтому мой вопрос заключается в том, имеет ли функция два параметра, а аргумент функции имеет два параметра (значение). Итак, как она работает в глобальном стеке, а также в стеке вызовов. это код

            function myfunction(a,b){
          return a*b;
      }
        var bana = myfunction(4,3);
      console.log(bana);

что такое EC(контекст выполнения) в JS?

Проще говоря, контекст выполнения - это абстрактная концепция среды, в которой код Javascript оценивается и выполняется. Всякий раз, когда какой-либо код выполняется в JavaScript, он выполняется внутри контекста выполнения.

Для получения более подробной информации: https://blog.bitsrc.io/understanding-execution-context-and-execution-stack-in-javascript-1c9ea8642dd0

Я полагаю, простой пример объяснит все.

Замечания: function.call(object) функция вызова function в контексте object

// HTML

​<p id="p"></p>​​​​​​​​​​​​​​​​​​​​​​​​

// JavaScript

function helloWorld() {
    alert("HelloWorld: " + this);
}

var p = document.getElementById("p");
helloWorld();                // HelloWorld: [object DOMWindow]
helloWorld.call(window);     // HelloWorld: [object DOMWindow]
​​​​​​helloWorld.call("String");   // HelloWorld: String // Note: "toString()"
helloWorld.call​​​​(p);          // HelloWorld: [object HTMLParagraphElement]
helloWorld.call(new Date());​​​​ // HelloWorld: Tue Feb 21 2012 21:45:17 GMT+0100 (Central Europe Standard Time)

Контекст выполнения - это оболочка, помогающая управлять кодом, который выполняется. В вашем коде вы увидите, что множество лексических сред означает, что области кода между {}, но какая из них в настоящий момент выполняется, управляются с помощью contextx.it может содержать ваш код и также может содержать помимо того, что вы написали в своем коде.

Другие вопросы по тегам