Przejdź do głównej zawartości

Bug #020

🪲 Znajdź buga

console.log(foo())
console.log(bar())

var foo = function () {
return "foo"
}

function bar() {
return "bar"
}

Co zostanie zalogowane do konsoli?

🧪 Rozwiązanie

console.log(bar())

var foo = function () {
return "foo"
}

console.log(foo())

function bar() {
return "bar"
}

W przykładzie z błędem, w konsoli ujrzymy Error: foo is not a function.

Podciągnięcie (hoisting) ma zastosowanie w obu przypadkach - deklaracji funkcji bar() oraz wyrażenia przypisania anonimowej funkcji do zmiennej foo zadeklarowanej z użyciem var.

Jeśli pozbędziemy się wywołania foo() generującego błąd, wywołanie bar() zadziała prawidłowo.

W przeciwieństwie do pociągania deklaracji funkcji bar(), w przypadku funkcji przypisanej do zmiennej foo podciągnięta zostaje tylko sama deklaracja zmiennej, bez przypisanej do niej wartości.

foo w momencie wywołania ma więc wartość undefined, a undefined funkcją nie jest, tak jak mówi nam treść błędu.

Patrząc na kod, możemy mieć jednak wrażenie, że foo funkcją jest i to treść błędu jest błędna.

Aby poprawić tą sytuację, możemy zamienić słowo kluczowe var na let lub const. Ujrzymy wtedy bardziej jasny komunikat błędu Error: Cannot access 'foo' before initialization.

Niemniej, żeby naprawić działanie kodu, musimy po prostu przenieść wywołanie funkcji za wyrażenie przypisywania funkcji do zmiennej.

🎢 Plac zabaw

Otwórz edytor w nowym oknie

📑 Linki

❤️ Podobają Ci się bugi JS?

Podziel się linkiem ze znajomymi:
https://codisity.pl/100-bugow-js