2011-01-26 21 views
16

menudo he ver las expresiones tales como:javascript function vs. (function() {...}());

(function() { 
    var x = 1; 
    ... 
}()); 

¿Cómo interpretarlo? sintácticamente, esto solo es una definición de función anónima.

function() { 
... 
} 

¿qué() después de eso? y por qué ponerlo en el adjunto()?

Gracias

+0

@delnan: Tienes razón, pero creo que es solo una de esas preguntas que es un poco difícil de buscar. Aunque apostaría que si una persona busca * "Qué es esta sintaxis en javascript" *, encontrará algunas respuestas. : o) – user113716

+2

@delnan: creo que podría estar en el sitio web equivocado. Esto es Stack Overflow, donde las personas acuden en busca de ayuda. ¿Estás perdido? Tal vez estás en el sitio web equivocado, tal vez? – jmort253

+0

@delnan, asumo que al hacer esta pregunta también estoy aprendiendo, pero no al nivel que te gusta o que consideras apropiado. Intenté buscarlo, pero no obtuve la respuesta. y Por eso, le agradezco a @patrick por tomarse el tiempo de responderme. – Oliver

Respuesta

24

exactamente el mismo, excepto que está siendo invocado inmediatamente después de ser convertida en una expresión de función.

// v-----first set of parentheses makes the function an expression 
    (function() { 
     var x = 1; 
     ... 
    }()); 
// ^-----this set is used to invoke the function 

Igual que si lo hizo:

var myfunc = function() { 
     var x = 1; 
     ... 
    }; 
    myfunc(); 

o (similar) esto:

var returnValue = function() { 
     var x = 1; 
     ... 
    }(); 

deshacerse de los nombres, mover los paréntesis alrededor, y se puede ver que' no es tan diferente.

+0

hmm, interesante. Creo que necesito profundizar más en el significado exacto de la expresión y la invocación de funciones, mucho. – Oliver

+1

@Oliver: hay algunas diferencias sutiles pero importantes entre las expresiones de funciones y las declaraciones. [Este es un excelente artículo] (http://kangax.github.com/nfe/) sobre las funciones en js. – user113716

+0

gracias por el artículo, buena lectura. respuesta aceptada – Oliver

2

El área donde más a menudo me resulta útil es en las funciones de devolución de llamada. Esta notación también se puede usar en casos donde necesite incluir una variable en una función de devolución de llamada, pero necesita que el estado de la variable no se vea afectado por lo que sucede fuera de la función.

var someVal = 1; 

setTimeout((function(one) { 
     return function() { 
      alert(one); // alerts a 1 even 10 seconds after someVal++; 
     } 
})(someVal), 10000); 

someVal++; // the value in the setTimeout will remain the same as it is locked inside. 

En este contexto, setTimeout toma una función que no toma argumentos. Entonces la pregunta de cómo pasar un valor a esa función se responde creando una función que toma un argumento que devuelve una función que toma 0 argumentos.

Sugiero a cualquiera que quiera aprender más sobre el poder de esta notación para jugar con ella en la consola Firebug JavaScript. Una vez que te hayas acostumbrado a este concepto, comenzarás a ver las áreas en las que se puede utilizar este poderoso concepto.

+0

¿cómo se llama "IT"? Si hace mucho calor, seguramente debe tener un nombre. –

+0

Creo que el término que está buscando es un "cierre". Hay varios otros usos para cierres, muchos de los cuales aún no he tenido la oportunidad de explorar. – jmort253

+0

eso es lo que pensé ... pero algunas búsquedas rápidas extrajeron una gran cantidad de información aparentemente no relacionada ... ¿y cuál es la diferencia entre un "cierre" y "clojure", me pregunto? –