2012-06-21 14 views
28

He trabajado un par de proyectos diferentes y he visto dos formas diferentes de crear funciones de jquery/javascript.Diferencia entre asignar la función a variable o no

La primera:

function testFunction(){ 

}; 

La segunda:

var testFunction = function(){ 

}; 

¿Hay una diferencia entre estos?

+3

http: // kangax. github.com/nfe/ lea esto –

+0

Secundado ....... –

Respuesta

43

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 
+8

+1 *** Conocimiento *** No sabía cómo funcionaba esto. Me he encontrado con problemas con 'var testFunction = function() {}' y no sabía por qué. Esto tiene mucho sentido. – iambriansreed

+0

IE9 corrigió ese error, ¿verdad? –

+0

@ ŠimeVidas - Derecha. Añadiré eso. –

Cuestiones relacionadas