natomiast:
Kopiuj
bar(); // TypeError: bar is not a function. Tutaj hoisting nie zadziała.
var bar = function bar() {
...
}
No właśnie hoisting tutaj zadziałał. Hoisting polega tylko i wyłącznie na przerzuceniu deklaracji zmiennej na początek scope'a, a nie całej definicji. Powyższy przykład, który napisałeś potwierdza te założenia.
Jeżeli próbujesz odwołać się do zmiennej zadeklarowanej poprzez var
jeszcze zanim deklaracja nastąpi:
Kopiuj
console.log(zmienna)
var zmienna = 'text'
Otrzymasz wartość undefined
, co jest spowodowane właśnie działaniem hoistingu, bo powyższy kod zostanie przez interpreter przerobiony na:
Kopiuj
var zmienna
console.log(zmienna)
zmienna = 'text'
Jeżeli natomiast zrobisz to samo, ale z użyciem let
lub const
:
Kopiuj
console.log(zmienna)
let zmienna = 'text'
Nie otrzymasz już undefined
, tylko throw z błędem zmienna is not defined
, bo przez brak hoistingu deklaracja zmiennej nie została przerzucona na początek scope'a
Trochę odbiegłem od tematu, ale wolałem wyjaśnić sprawę by nie było niedopowiedzeń :P