La diferencia principal es que la primera (una declaración de función) es izada en la parte superior del ámbito en el que se declara, mientras que la segunda (una expresión de función) no lo es.
Esta es la razón por la que son capaces de llamar a una función que ha sido declarado después de que usted le llama:
testFunction();
function testFunction() {}
No se puede hacer eso con una expresión de función, ya que la asignación ocurre en el lugar:
testFunction();
var testFunction = function() {}; //TypeError
también hay una tercera forma (un llamado expresión de función):
var testFunction = function myFunc() {};
En este caso, el identificador myFunc
está solo dentro del alcance dentro de la función, mientras que testFunction
está disponible en cualquier ámbito que se declare. PERO (y siempre hay un pero cuando se trata de Internet Explorer) en IE debajo de la versión 9, el identificador myFunc
se filtra erróneamente al ámbito que lo contiene. Las expresiones de funciones nombradas son útiles cuando necesita referirse a la función de llamada (ya que arguments.callee
está en desuso).
También tenga en cuenta que lo mismo es cierto para las declaraciones de variables:
console.log(x); //undefined (not TypeError)
var x = 10;
Usted puede imaginar que el motor de JavaScript interpreta el código como el siguiente:
var x; //Declaration is hoisted to top of scope, value is `undefined`
console.log(x);
x = 10; //Assignment happens where you expect it to
http: // kangax. github.com/nfe/ lea esto –
Secundado ....... –