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

Забележка: JavaScript повдига само декларации, не и инициализации.

#undefined срещу ReferenceError

1-ви пример:

console.log(typeof variable); // Output: undefined

› В JavaScript на недекларирана променлива се присвоява стойност undefined при изпълнение и също е от тип undefined.

2-ри пример:

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

› В JavaScript се хвърля ReferenceError при опит за достъп до недекларирана преди това променлива.

#Подемни функции

Функциите на JavaScript могат да бъдат класифицирани свободно като следното:

Декларации на функции:

hoisted(); // Output: "This function has been hoisted."

function hoisted() {
  console.log('This function has been hoisted.');
};

Функционални изрази:

expression(); //Output: "TypeError: expression is not a function

var expression = function() {
  console.log('Will this work?');
};

Нека опитаме комбинацията от декларация на функция и израз.

Както можем да видим по-горе, декларацията на променлива var expression е повдигната, но това е присвояване на функция, която не е. Следователно интерпретаторът хвърля TypeError, тъй като вижда expression като променлива, а не функция.

#Технически класове

JavaScript класовете могат да бъдат класифицирани в два класа:

Декларации на класове:

var Hero = new Honda();
Hero.height = 100;
Hero.weight = 300;
console.log(Hero); // Output: ReferenceError: Hero is not defined

class Honda {
  constructor(height, weight) {
    this.height = height;
    this.weight = weight;
  }
}

Сигурен съм, че сте забелязали, че вместо да получим undefined, ние получаваме Reference error. Това доказателство потвърждава нашата позиция, че декларациите за класове са повдигнати.

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

class Honda {
  constructor(height, weight) {
    this.height = height;
    this.weight = weight;
  }
}

var Hero = new Honda();
Hero.height = 100;
Hero.weight = 300;
console.log(Hero); // Output: { height: 100, weight: 300 }

Класови изрази:

var Hero = new Honda();
Hero.height = 10;
Hero.width = 10;
console.log(Hero); // Output: TypeError: Honda is not a constructor

var Honda = class {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

Ето пример с наименуван израз на клас.

var Hero = new Honda();
Hero.height = 10;
Hero.width = 10;
console.log(Hero); // Output: TypeError: Honda is not a constructor


var Honda = class Honda {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

Правилният начин да го направите е следният:

var Honda = class Honda {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
};

var Hero = new Honda();
Hero.height = 10;
Hero.width = 10;
console.log(Hero);