2012-02-13 14 views
8

Lo siento por publicar esta función pero! No es googleable y no lo encontré en mi código JavaScript.¿Qué significa! Function in Javascript?

Aquí es cómo Twitter lo utiliza:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://google.com" data-text="Google says">Tweet</a> 
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> 

de https://twitter.com/about/resources/buttons#

Respuesta

21

Es corto mano o alternativa de self-invoking anonymous function:

(function(){ 
    // code 
})(); 

se escribe:

!function(){ 
    // code 
}(); 

También se puede utilizar en lugar de +!.

Si simplemente lo hizo:

function(){ 
    // code 
}(); 

que va a crear problemas, por eso es necesario agregar ! ante el mismo que convierte a la declaración de la función en expresión de función.

Quoting docs, section 12.4:

An ExpressionStatement cannot start with the function keyword because that might make it ambiguous with a FunctionDeclaration.

Para entender mejor el concepto, que debe salir:

+0

Interesante. ¿Cuándo es útil una función anónima de autoinvocación? ¿Cómo es diferente de simplemente ejecutar las declaraciones dentro? – netvope

+1

@netvope: ver http://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Sarfraz

+0

Ya veo. Gracias. Sería bueno si Javascript admite el alcance con solo los refuerzos (como en C++) – netvope

2

que están negando el resultado, no la propia función:

!function(x){ return x }(true); 
!true 
false 

En realidad, es un poco comprimida forma de:

(function(){}()) 

ya que requiere 1 menos de carácter. La razón por la que se necesita es que no se puede llamar a una declaración de función directamente, p. esto es válido:

function(){}() 

pero añadiendo la ! al principio lo convierte en una función expression y hace que funcione.

+0

Técnica de interés ... –

+1

"anulando el resultado" es engañosa, la respuesta de @ Twisol es más preciso –

+0

@ ŠimeVidas - Tengo la sensación de esto se genera el código en busca de patrones de función auto-invocando como lo hace ahorrar 1 carácter :) –

2

Por lo general se utiliza para evitar una peculiaridad en la sintaxis de JavaScript. Esto da un error de sintaxis:

function() { 
}(); 

Se lee como una declaración de función (como function foo() {}), en lugar de una expresión de función. ¡Entonces agregando el! antes, o envolverlo entre paréntesis, obliga al analizador a entender que es una expresión.

+0

No es una peculiaridad de la sintaxis. Es solo sintaxis. –

Cuestiones relacionadas