jsFiddle Demo
As a result of hoisting, this is equivalent to
(function f(){
var f;
f = function(){ return 1; };
f = function(){ return 2; };
f = function(){ return 1.5; };
return f();
})();
Hoisting can be tricky, as there are two aspects of it occurring here. First, the variable definition is hoisted
Every definition of a variable is really a declaration of the variable at the top of its scope and an assignment at the place where the definition is.1
Next, each function initialization is hoisted
Functions initializations happen at the top of the parent function (above vars). Since vars declarations with names already existent as a parameter or a function are no-ops, we get some surprising results.1
1: Scope Cheatsheet MDN