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');
 }
