есть термин объявление и присвоение.
Фишка var переменных, то что они всплывают - их объявление "вспылвает", а вот присвоение значения происходит на той точке, где вы записываете в нее значение:
console.log(foo); // undefined - не ошибка
var foo = 5;
console.log(foo); // 5
В первой строке программы происходит так называемый rhs-поиск(поиск по значениею), поскольку объявление переменной
foo
всплыло и ошибки не будет.
Теперь по поводу funcion и переменные:
объявление функции тоже всплывает, но позже чем переменная через var:
var a = 5;
function a() {
return 5;
}
console.log(a) // 5