La primera es una declaración de función nombrada, la segunda asigna una expresión de función anónima a una variable.
Se añade la sentencia de función a su alcance inmediato - no es necesario para ejecutarlo antes de poder llamarlo, por lo que este funciona:
var y = sum(1, 2);
function sum(x, y) {
return x + y;
}
Pero la expresión función sólo se asigna a la variable cuando se ejecuta el código, por lo que este no funciona:
// Error here because the function hasn't been assigned to sum yet.
var y = sum(1, 2);
var sum = function(x, y) {
return x + y;
}
Una ventaja de la forma de expresión es que se puede utilizar para asignar diferentes funciones a la expresión en diferentes puntos - para que pueda cambiar la función, o use uno diferente bajo diferentes condiciones ons (como dependiendo del navegador que se use).
Una ventaja de una declaración de función con nombre, es que los depuradores podrán mostrar el nombre. Aunque, puede nombrar a las expresiones de función:
var sum = function sum(x, y) {
return x + y;
}
pero esto puede ser confuso ya que los dos nombres son en realidad en distintos ámbitos y se refieren a cosas diferentes.
para no usar la función de nombre, solo use la función anónima para encapsular, evitando la contaminación variable del alcance global –