Bug #016
🪲 Znajdź buga
const myDog = new Dog()
const myCat = new Cat()
function Dog() {
this.name = "Pluto"
}
class Cat {
constructor() {
this.name = "Garfield"
}
}
console.log(myDog.name)
console.log(myCat.name)
Czy przedstawiony kod zadziała poprawnie? Jeśli nie, to gdzie kryje się błąd?
🧪 Rozwiązanie
const myDog = new Dog()
function Dog() {
this.name = "Pluto"
}
class Cat {
constructor() {
this.name = "Garfield"
}
}
const myCat = new Cat()
console.log(myDog.name)
console.log(myCat.name)
Uruchomienie kodu z błędem wyrzuci nam do konsoli błąd Cannot access 'Cat' before initialization
.
W JavaScript deklaracje funkcji oraz zmiennych definiowanych wyrażeniem var
są podciągane na początek wykonywanego kodu. Własność tą z j. angielskiego nazywamy hoisting.
Hoisting w JS oznacza, że możemy najpierw wywołać funkcję, a dopiero w dalszej części kodu ją zdefiniować.
Nie możemy jednak zrobić tego samego z klasą. Deklaracja class
nie jest podciągana, przez co nie możemy jej wywołać przed jej zdeklarowaniem.
I dokładnie to jest powodem wystąpienia błędu w wcześniej przedstawionym błędnym kodzie.
Aby naprawić błąd, musimy po prostu przenieść wywołanie new Cat()
do dalszej części kodu, aby wywołanie nastąpiło już po deklaracji klasy.
🎢 Plac zabaw
Otwórz edytor w nowym oknie📑 Linki
- Hoisting - MDN Web Docs Glossary: Definitions of Web-related terms | MDN
- new operator - JavaScript | MDN
- Classes - JavaScript | MDN
- Working with objects - JavaScript | MDN
❤️ Podobają Ci się bugi JS?
Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js