buenas...
en realidad no hay tanta diferencia uno del otro. lo que cambia es la sintaxis para crear la función. el primero es una función literal anónima —también puede ser nombrada— y el segundo es una declaración de función. en términos de invocación de la función, siguen siendo exactamente iguales. el único detalle que los diferencia es que a nivel del intérprete, una declaración de función se interpreta antes que una función literal. en la siguiente muestra, nótese el orden de sentencias... primero un console.log antes de definir las funciones. en la consola, te mostrará dos resultados: una función y undefined.
Código:
(function (){
console.log(foo, bar);
function foo (){} // function declaration
var bar = function (){}; // literal function or expression
})();