В 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:
Herois 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);