Обяснено повдигане в JavaScript

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

Променливо повдигане.

Променливо повдигане с вар.

console.log(x);  //The output is undefined
var x=17;

Не получавате грешка като изход. Вместо това получавате недефиниран.

Тук паметта е разпределена за променливата, но тя просто все още не е инициализирана, но можете да извикате променливата без грешка. Това е променливо повдигане.

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

  • Създаване на памет
  • Екзекуция

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

var a;  //memory allocated
console.log(a); // undefined
a = 17;  //var intialised
console.log(a); // Output is 17

Тук, във втория ред, получаваме „недефинирано“, защото променлива a е издигната и получава стойност по подразбиране недефинирано. Променливата a се инициализира в третия ред и следователно получаваме резултата като 17, когато се изпълни четвъртият ред. Но ако console.log недекларирана променлива, тя хвърля Референтна грешка(недефинирана), защото декларацията не е повдигната.

console.log(b); // ReferenceError: b is not defined

Променливо повдигане с отпуск и конст

Променливите, декларирани с let и const, се издигат, но не се инициализират със стойност по подразбиране. Достъпът до променлива let или const, преди да е декларирана, ще доведе до Референтна грешка.

console.log(a); // ReferenceError: Cannot access 'a' before initialization

let a = 10;


console.log(b); //ReferenceError: Cannot access 'b' before initialization

const b = 10;

Тъй като b е деклариран с const, не може да му бъде присвоена нова стойност, след като е деклариран.

Причината, поради която възниква ReferenceError, е временната мъртва зона.

Какво е времева мъртва зона?

Времевата мъртва зона е зона, в която променливите са недостъпни преди инициализацията им. Това е област на обхват, където променлива е декларирана, но не може да бъде достъпна или използвана. Ако се опитаме да осъществим достъп до такива променливи, получаваме ReferenceError. По принцип всяка променлива let и const преминава през Времева мъртва зона. TDZ започва в началото на обхващащия обхват на променливата и завършва, когато тя бъде декларирана.

{
    //var b is going to have a TDZ
    let a =10;
    console.log(a); // 10

    console.log(b);  //ReferenceError: Cannot access 'b' before initialization 'b' is in TDZ
    let b = 20;  // 'b' is now out of TDZ
    console.log(b);  //20 
}

Функционално повдигане

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

greet();  // Hey, welcome to my blog

function greet(){
console.log("Hey, welcome to my blog");
}

В горния пример функцията greet() отпечатва „Хей, добре дошли в моя блог“, въпреки че е извикана преди декларацията на функцията.

Едно важно нещо, което трябва да забележите, е, че изразите не се повдигат. т.е. ако присвоите функция на var, тя не се повдига. Когато извикаме променливата, към която е присвоен изразът на функцията, ще получим TypeError или ReferenceError, в зависимост от обхвата на променливата.

greet();  //TypeError: greet is not a function

var greet() = function {
console.log("Hey, welcome to my blog");
}
greet();  //ReferenceError: Cannot access 'greet' before initialization
let greet = function(){
console.log("Hey, welcome to my blog");
}
greet();  //ReferenceError: Cannot access 'greet' before initialization
const greet = function(){
console.log("Hey, welcome to my blog");
}

По същия начин функциите със стрелки също не се издигат в JavaScript.

greet();  //TypeError: greet is not a function
var  greet = () => {
    console.log('Welcome to my blog');
  }

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

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