Что такое "контекст выполнения" в 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 важных для вас вещи:
- Глобальный объект -
window
- Специальный объект
this
- Ссылка на внешнюю среду
Давайте посмотрим на простой пример, чтобы понять 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: контекст выполнения
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.
Он состоит из следующего -
- Глобальный объект
- 'этот'
- Внешняя среда
- Ваш код
Контекст выполнения создается каждый раз, когда вы запускаете файл / приложение.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 может содержать ваш код и также может содержать помимо того, что вы написали в своем коде.