javascript hoisting

var declaration

hoisted to the top of scope, without assignment.

 var a = 1;
 function printA() {
     console.log(a);
     var a = 2;
     console.log(a);
 }
 printA();
 //undefined
 //2

function declaration

hoisted with assignment.

 foo();
 //foo
 function foo() {
     console.log('foo');
 }

Pay attention!

while function declarations are hoisted with their assignment, function expressionsare just regular vars hence hoisted without their assignment.

 goo();
 //undefined is not a function
 var goo = function () {
     console.log('goo');
 }