Когато JavaScript чете скрипт файл, той създава среда, наречена Execution Context, която управлява процеса на конвертиране и изпълнение на кода.

По време на изпълнението на контекста анализаторът проверява изходния код и запазва място за съхранение за променливите и функциите. След това изходният код се генерира и изпълнява.

Има два типа контексти на изпълнение:

  • глобален:Глобалният контекст на изпълнение се генерира, когато програма на JavaScript за първи път започне да се изпълнява, и той определя обхвата на цялата програма.
  • функция: При всяко извикване на функция се формира контекст за изпълнение на функция, който представлява локалния обхват на функцията.

Фази на контекста на изпълнение

Има две фази на контекста на изпълнение на JavaScript:

  1. Фаза на създаване: В тази фаза механизмът на JavaScript създава контекста за изпълнение и настройва средата. Той разпределя памет за variables и functions и присвоява съответно undefined и функция като стойности.
  2. Фаза на изпълнение: В тази фаза механизмът на JavaScript изпълнява кода в контекста на изпълнение. Той обработва всички оператори или изрази в скрипта и оценява всички извиквания на функции.

Всичко в javascript се случва в този контекст на изпълнение. Разделен е на две фази. Единият е memory, а другият е code.

Фаза на създаване

Нека да разгледаме един пример още веднъж:

let number1 = 2;                              // line 1
let number2 = 3;                              // line 2
function addition(num1, num2){                // line 3
  const result = num1 + num2;                 // line 4
  return result;                              // line 5
}                                             // line 6
let sum = addition(number1, number2);         // line 8
console.log(sum)                              // line 9

В началото двигателят на JavaScript изпълнява пълния изходен код, настройва глобален контекст за изпълнение и след това извършва следните действия:

  1. Създайте a global execution context.
  2. Разпределете памет за variables и functions и им присвоете съответно начална стойност undefined и функция definition.

В края на фазата на създаване контекстът на изпълнение ще се появи, както следва:

След като фазата на създаване приключи, контекстът на изпълнение ще премине към фазата на изпълнение на кода.

Фаза на изпълнение

В тази фаза се извършва основното изпълнение и javascript преминава през кода ред по ред:

  1. Сега стойността number1 се променя от недефинирано на 2. След това се премества на следващия ред.
  2. стойността number2 се променя от недефинирана на 3 и се премества на следващия ред, тъй като няма нищо за изпълнение, тя се премества на ред 8.
  3. на ред 8 се извиква функция, която създава нов контекст на изпълнение на функция в рамките на глобалния контекст на изпълнение. Фазите creation и execution се появяват в този нов контекст. creation фаза разпределя памет за променливи и след това execution фаза изпълнява код и присвоява стойности на променливи и след това функцията ще присвои резултата от num1 + num2 в result променлива и след това ще върне стойността на result.

4. на ред 8, върнатата стойност от addition() ще бъде присвоена на sum.

5. след като изпълнението на кода приключи, глобалният контекст ще се появи, както е показано, и ще бъде унищожен.

За да следи всички контексти, глобални и функционални контексти, двигателят на JavaScript използва стек за повиквания.

Какво представлява стекът за повиквания?

Стекът от повиквания поддържа „Реда на изпълнение на контекстите на изпълнение“. Той работи като стек, където контекстът на изпълнение на нова функция, която се извиква, се добавя в горната част на стека за извикване.

Глобалният контекст на изпълнение (GEC) се намира в долната част на стека за извикване, тъй като се генерира в началото на програмата и всички последващи контексти на изпълнение се добавят върху него. Следователно, когато изпълнението на функция е завършено, нейният контекст на изпълнение се премахва от стека на извикванията.

за по-добро разбиране, нека видим следния пример:

function sum(num1, num2) {
    return num1 + num2;
}

function getResult(num1, num2, sumHandler) {
    return sumHandler(num1, num2)
}

var result = getResult(10, 20, sum);

console.log(result); // 30

Първоначално той разпределя памет за функциите sum и getResult, последвани от променливата result. След това извиква getResult(), което се добавя към стека за повиквания. Впоследствие getResult() извиква sumHandler(). Следователно контекстът на sumHandler се поставя в горната част на стека на повикванията.

След като изпълнението на всяка функция приключи, тя ще бъде елиминирана от стека за повиквания. Придружаващата снимка илюстрира целия процес на изпълнение:

Заключение

Разбирането на контекста на изпълнение на JavaScript е от решаващо значение за разбирането на много други фундаментални концепции.

Контекстът на изпълнение, който включва глобалния контекст на изпълнение (GEC) и контекста на изпълнение на функцията (FEC), както и стека на повикванията, са процедурите, изпълнявани от двигателя на JavaScript, които позволяват на нашия код да се изпълни.

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

Благодаря за четенето,