2012-01-25 38 views
6

Duplicar posibles:
!function(){ }() vs (function(){ })()Cuál es la diferencia entre la función() {}() y la función() {}()

Así que estaba leyendo a través de la fuente de el nuevo Bootstrap (2.0) de Twitter y notó que hay un signo de exclamación antes de la función anónima autoinvocatoria. Cuando vi esto, inmediatamente pensé "Oh, mierda, ¿hay una nueva y mejor manera de hacer esto?".

¡Compruébelo usted mismo!

De todas formas, ¿cuál es la diferencia? Debe haber una razón para ello porque lo usan consistentemente en todos sus complementos de JavaScript (para Bootstrap).

Otra cosa que noté fue el "uso estricto" después de esto. No creo que esté relacionado con mi consulta anterior, pero ¿alguien puede explicar esto?

Gracias!

Respuesta

14
function(){}(); 

Por sí mismo (ver el comentario de punto) no va a ser válida, ya que

function() {} 

es una declaración de la función. Para invocarlo de inmediato, debe obtener el motor de JavaScript para tratar la función como una expresión . La gente suele hacer esto como cualquiera de

(function(){})(); //more common 

(function(){}()); // Papa Crockford's preference: 

con

!function(){}(); 

ser simplemente una versión abreviada de la misma cosa.

+2

+1. ¡Estás que ardes! – gdoron

+0

+1 Aunque más tarde no es obligatorio, pero es una buena práctica para Doughlas Crackford :) – Sarfraz

+0

@gdoron - y tengo un límite ahora. Es mejor que vuelva al trabajo :) –

8

Si usted tiene 2 guiones:

script1.js:

(function(){ 

})() 

script2.js:

(function(){ 

})() 

Y les concatenar, se obtiene:

(function(){ 

})() 
(function(){ 

})() 

Esto provoca un error, mientras que:

!function(){ 

}() 
!function(){ 

}() 

No.

+0

+1 Eso es bueno saberlo. – Sarfraz

+0

Esta es también la razón por la que algunos scripts usan un punto y coma al comienzo: '; (function() {}())' – hugomg

+1

Entonces, ¿sería seguro decir '; (function() {}())' and ' ! function() {}() 'sirve el mismo propósito? – Johnny

3

El ECMAScript Language Specification, sección 12.4, dice:

Un ExpressionStatement no puede comenzar con la palabra clave function debido a que podría hacer que sea ambigua con un FunctionDeclaration .

Por lo tanto, si desea una declaración de expresión que ejecute una función anónima, debe evitar esta restricción. Agregar un ! (que simplemente niega el resultado de la función) deja en claro para el intérprete que no es una declaración de función, evitando esta ambigüedad.

Cuestiones relacionadas