declaração var
içado até o topo do escopo, sem atribuição.
var a = 1;
function printA() {
console.log(a);
var a = 2;
console.log(a);
}
printA();
//undefined
//2
declaração de função
içado com atribuição.
foo();
//foo
function foo() {
console.log('foo');
}
Preste atenção!
enquanto as declarações de função são içadas com sua atribuição, as expressões de função são apenas vars regulares, portanto, içadas sem sua atribuição.
goo();
//undefined is not a function
var goo = function () {
console.log('goo');
}