Javascript Hoisting Explained

A common question that people have when learning Javascript is what the difference is between a function expression and a function declaration.
For example:

Function Expression

var x = function(){
  return true;
};

vs #

Function Declaration

function x(){
  return true;
};

The key difference between these two patterns has to do with variable hoisting. Variable hoisting is something that happens when your Javascript is “compiled” by the browser. The browser reads your code and grabs all of your function and variable declarations and moves them to the top of their scope.

Like this:

function(){

  var a = true;
  var b = true;

  var c = function(){
    return true;
  };

  function d(){
    return true;
  };

}();

Gets “compiled” and becomes this for when the code is executed:

function(){

  function d(){
    return true;
  };
  var a;
  var b;
  var c;

  a = true;
  b = true;

  c = function(){
    return true;
  };

}();

As you see, all of the function and variable declarations get put at the top of their current scope. Declarations move to the top but all expressions occur where the code is written.

A Common Gotcha: #

The following code throws an error:

function(){

  a();
  b();//Uncaught TypeError: undefined is not a function

  function a() {
    return true;
  };
  var b = function(){
    return true;
  };

}();

The reason we get an error is because var b is hoisted but not the function that is on the right side of the expression.

Here’s what that code looks like at runtime with its declarations hoisted:

function(){

  function a(){
    return true;
  };
  var b;

  a();
  b();//Uncaught TypeError: undefined is not a function

  b = function(){
    return true;
  };

}();
 
196
Kudos
 
196
Kudos

Now read this

Simple Recursion

A significant chunk of Hack Reactor’s pre-course work involves rebuilding several javascript functions that utilize recursion. The first time I saw recursion I had a very difficult time mentally wrapping my mind around it. My brain... Continue →