JavaScript прежде всего известен как язык большинства современных веб-браузеров, и его ранние особенности создали ему плохую репутацию. Однако язык продолжал развиваться и совершенствоваться. JavaScript — это мощный, гибкий и быстрый язык программирования, который сейчас используется для все более сложной веб-разработки и не только!

Поскольку JavaScript остается основой веб-разработки, часто это первый язык, который изучают программисты-самоучки, стремящиеся учиться и строить.

Но если вы когда-нибудь задумывались о том, как работает JavaScript внутри, на самом деле очень легко понять, как работает JavaScript.

«В JavaScript все происходит внутри контекста выполнения».

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

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

Например

let a=3;

эта строка встречается в первой строке, поэтому она хранится в формате a : 3,
но 3 не присваивается ‘a’ так быстро, как вы думаете.

первая фаза создания памяти - это создание пространства памяти для переменных в программе, не присваивая значения этим переменным. изначально ему присваивается заполнитель undefined, что означает, что фактическое значение переменной не присваивается.

Второй компонент, пока назовем его код, где выполняется каждая строка кода и дается причудливое имя — Этап выполнения.

пример стоит тысячи слов

теперь мы будем использовать этот пример во всем блоге.

«JavaScript — это синхронный однопоточный язык. он выполняет только одну строку за раз в определенном порядке».

для этой вышеприведенной программы контекст выполнения создается в два этапа, как я уже говорил ранее, первый — это этап создания памяти.
На этом этапе выделяется место в памяти для всех переменных, используемых в программе.
В строке 1 a выделяется место в памяти с неопределенным значением.
undefined похож на заполнитель, указывающий, что значение еще не присвоено.

в строке 2 он встречает квадрат функции, где он сохраняет весь программный код этой функции в квадрат.

В компоненте кода JavaScript выполняется построчно, выполняя код.
В строке 1 теперь на этом втором этапе «2» хранится в переменной «a», теперь она больше не будет неопределенной.

теперь он перейдет к строке 8, где встретится с вызовом функции, т. е. с переменной в квадратных скобках().
когда вы вызываете функцию, создается новыйновый контекст выполнения.

снова все шаги и создание фазы повторяются, но только для квадрата функции, теперь мы будем выделять память всем переменным, используемым в функции.

число: не определено
ответ: не определено

let squareN= square(a)

теперь на этапе выполнения кода
здесь мы передаем переменную в качестве аргумента параметру num
, поэтому он поместит num=n, который равен 2, в новом компоненте памяти контекстов выполнения, затем код переместится в строку .

let ans= num*num;

теперь он попытается выполнить код, фактически выполнив умножение, и сохранит этот результат в an , поэтому переменная an теперь станет равной 4.

число: 2
число: 4

Теперь в следующей строке он встречает оператор return, поэтому он вернет управление программой, в которой вызов функции произошел с переменной ans
в строке let SquareN= sqaure(n) .

Он найдет значение 4 в переменной и в своей локальной памяти (создан новый контекст выполнения) и присвоит значение 4 переменной SquareN, теперь контекст выполнения, который был создан ранее, теперь удален. так как нет кода для выполнения.

когда вся программа выполняется, глобальный контекст выполнения означает, что первый контекст выполнения также удаляется.

теперь вы, должно быть, думаете о том, как JavaScript отслеживает эти контексты выполнения

yes В JavaScript есть стек вызовов, в котором запускается каждая программа JavaScript, этот стек вызовов заполняется глобальным контекстом выполнения.

всякий раз, когда происходит вызов функции, контекст выполнения помещается в стек, когда выполнение кода контекста выполнения завершается или когда он сталкивается с оператором возврата, контекст выполнения (EC1) выталкивается из стека вызовов, а управление кодом переходит в Global Execution Context (GEC).

когда выполнение всей программы завершено, Global Execution Context (GEC) также выталкивается из стека вызовов.

Есть одна вещь, которую вы должны помнить: «Cвесь стек поддерживает порядок выполнения Execution Context».