2011-03-24 12 views

Respuesta

41

El precedente ! toma la declaración de la ONU analizable, y permite que sea analizado por el motor de JS, que a su vez devuelve verdadero.

function(){}(); 
SyntaxError: Unexpected token (

!function(){}(); 
>>true 
+0

impresionante, gracias a Mike. – Stuart

+25

Esto es tan engañoso, no hace que todo se pueda analizar, hace que una declaración de función se analice como una expresión, que evalúa la función en sí, lo que permite que se llame. – michelpm

12

Simplemente hace que el analizador de JavaScript lo analice como una expresión, que es necesaria para ejecutarlo.

+1

Esa puede ser la motivación. Pero la expresión resultante todavía se comporta como cualquier expresión con '!'. –

+5

@Matthew: No puedo hablar por gaoshan88, pero parece que le interesa la motivación, ya que lo comparó (correctamente) con otra forma común de escribir funciones autoejecutables. –

12

Lo he probado, ha sido verdad. La función devuelve undefined, y !undefined es verdadera.

!function(){}(); 
^  ^^ 
C   A B 
  • A. function(){} es una función vacío anónimo
  • B. () ejecuta la función (A), volviendo undefined
  • C. ! niega undefined, que se convierte true

Creo que usaron ese truco para un código de golf o un código ofuscado. Es una mala práctica utilizar practially que

Trate javascript:alert(!function(){}()) en su navegador barra de direcciones