Кратък преглед ✨

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

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

Например, просто да предположим, че контекстът на изпълнение не е нищо друго освен област, където JavaScipt извършва оценка и изпълнение на кода. Всеки път, когато някакъв код се изпълнява в JavaScript, всичко се случва в контекст на изпълнение.

Едно нещо, което винаги трябва да помним, когато говорим за контекст на изпълнение, т.е. В JavaScript всичко се случва в контекст на изпълнение. Контекстът на изпълнение се състои от две фази, а именно Променлива среда и Нишка на изпълнение/изпълнение на код.

Две фази на контекста на изпълнение ✨

Както научихме в горния раздел, основно имаме две фази, които са Променлива среда и Нишка за изпълнение/изпълнение на код.

  • Променлива среда

Първоначалната фаза в контекста на изпълнение, където разпределя памет за променливи и съхранява всичко в двойки ключ-стойност, които са под формата на обекти. Скоро ще видим кодов фрагмент и картинно представяне на това как всичко влиза и излиза.

  • Нишка на изпълнение

Втората най-голяма фаза е в контекста на изпълнението, където всеки оператор на код се изпълнява един по един според обичайното поведение на JavaScript (синхронно и еднонишково).

Зад кулисите ✨

Нека да видим как всичко се случва под JavaScript зад капака с помощта на кодов фрагмент, той е долу.

console.log(x); //prints: undefined
printHere(); //prints: Fun Learning hoisting
console.log(printHere); //prints: the whole function body in the form of object value
function printHere(){
    console.log("Fun learning hoisting");
}
var x = 10;
console.log(x) //prints: 10 (as expected)

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

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

И така, първоначално във фаза 1, когато декларираме която и да е променлива с помощта на ключовата дума var, на променливата се присвоява недефинирана стойност. И така, можем да кажем, че в среда с променливи променливите, функциите или класовете се издигат в паметта и променливите с var се инициализират с undefined, докато на променливите let & const не се присвояват никакви стойности и ще хвърлят референтна грешка при достъп до него преди дефиницията му. Функциите се съхраняват като двойки ключ-стойност по такъв начин, че името на функцията е ключът, докато тялото на функцията се съхранява като стойност на обект

И накрая, във фаза 2, която също е известна като нишка на изпълнение, всички изрази се изпълняват ред по ред според обичайното поведение на JavaScript, че са синхронни и еднонишкови.

Заключение ✨

Никога не бихте виждали подобно странно поведение в езици за програмиране като C/C++, Java и т.н. Ако се опитате да го направите, ще попаднете на референтна грешка при рефериране на променлива преди нейната декларация. Но JavaScript не ви хвърля такива грешки, тъй като просто ви позволява достъп до всичко преди дефиницията му, тъй като всичко е издигнато отгоре. Обикновено, тъй като JavaScript е модерен език и целият браузър е изграден върху Js.

Бърз забавен факт ✨

Въобще знаете ли, че недефинираните и недефинираните са различни?

Така че, когато вашата променлива, декларирана с ключова дума var, бъде повдигната, ѝ се присвоява специална недефинирана стойност и тя конзолира същата при достъп до нея преди дефиницията, както видяхме по-горе. Но ако не декларираме самата променлива, нищо не се повдига и при достъп получаваме референтна грешка, която казва, че конкретната променлива не е дефинирана.