2010-03-11 11 views
53

Estoy tratando de leer la fuente del Prototipo. He venido a esta parte. (Desafortunadamente, este fragmento está al principio).¿Qué hacen los paréntesis vacíos() después de una declaración de función en javascript?

¿Qué significa esto()?

Browser: (function(){ 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile.*Safari/.test(ua) 
    } 
    })(), 

Me refiero a la última línea antes de la coma?

+1

Nota: de acuerdo con jslint debe mover el padre de ejecución final dentro de la función entre paréntesis: '(function() {...}()) ' – ErikE

+0

@ErikE En última instancia, hacen lo mismo. Consulte esta pregunta: http://stackoverflow.com/questions/6645766/why-are-parenthesis-used-to-wrap-a-javascript-function-call –

+0

No hay argumento de que hagan lo mismo. Es una consideración estilística, porque al no colocar los paréntesis de ejecución dentro del par externo, puede no estar claro que lo que se devuelve es el * resultado * de la función en lugar de * la función en sí *. – ErikE

Respuesta

40

El código está definiendo una función anónima (el bit (function(){ ... })) y llamándola (sin argumentos). A continuación, asigna el valor a la propiedad Browser del objeto que, presumiblemente, se está definiendo fuera de su fragmento de código.

También puede definir la función alguna parte:

function myFunction() { 
    var ua = navigator.userAgent; 
    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; 
    return { 
     IE:    !!window.attachEvent && !isOpera, 
     Opera:   isOpera, 
     WebKit:   ua.indexOf('AppleWebKit/') > -1, 
     Gecko:   ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, 
     MobileSafari: /Apple.*Mobile.*Safari/.test(ua) 
} 

y luego llamarlo:

var foo = myFunction(); 

y luego asignar el valor:

... 
Browser: foo, 
... 

Una desventaja con hacerlo de esa es que "contaminas tu espacio de nombre" con una función y una variable que no usarás en ningún otro lado . El segundo problema es que no puede usar el valor de cualquier variable de ámbito local en la definición de su función (la función anónima se comporta como un cierre).

5

Es una llamada de función simple, no diferente de foo() excepto que está invocando una función anónima literal, el resultado de la función se asigna a la propiedad Browser.

11

llama a la función anónima que se acaba de declarar, lo que hace que se evalúe efectivamente el "bloque".

27

(function() {}) crea una función anónima.

Agregando el () al final se llama a la función que se acaba de crear.

En el caso de esta función en particular, la función anónima devuelve varias propiedades al objeto Browser. Por lo tanto, termina con valores booleanos para, por ejemplo, Browser.IE, Browser.Opera, etc.

+2

¿Cuál es la notación correcta? '(function() {}());' OR '(function() {})();' - Estoy hablando del orden de paréntesis al final. – ayjay

+2

el primero es el correcto @ayjay – Jonesopolis

+2

@ayjay En realidad, cualquiera de los dos tiene razón, pero Crockford usa el primero, así que me gustaría ir con eso. [Http://javascript.crockford.com/code.html](http://javascript.crockford.com/code.html) – GFoley83

Cuestiones relacionadas