2009-06-02 14 views
100

Hay una opción de JSLint, una de las partes buenas de hecho, que "[requiere] parens alrededor de invocaciones inmediatos", es decir que la construcciónFunción inmediata sintaxis de invocación

(function() { 

    // ... 

})(); 

que en vez tenga que ser escrito como

(function() { 

    // ... 

}()); 

Mi pregunta es esta: ¿alguien puede explicar por qué esta segunda forma se puede considerar mejor? ¿Es más resistente? ¿Menos propenso a errores? ¿Qué ventaja tiene sobre el primer formulario?


Desde esta pregunta, he llegado a comprender la importancia de tener una clara distinción visual entre los valores de la función y los valores de las funciones. Consideremos el caso en que el resultado de la invocación inmediata es la parte derecha de una expresión de asignación:

var someVar = (function() { 

    // ... 

}()); 

Aunque los paréntesis más externos son sintácticamente innecesaria, el paréntesis de apertura da una indicación por adelantado que se le asigna el valor se no la función en sí, sino más bien el resultado de la función que se invoca.

Esto es similar al consejo de Crockford con respecto a la capitalización de las funciones de constructor: está destinado a servir como una señal visual para cualquiera que mire el código fuente.

+0

Gracias por señalar esto. Nunca encontré la forma de deshacerme del mensaje de advertencia de JSLint "Tenga cuidado al hacer funciones dentro de un ciclo". Fui cuidadoso y puse la función en un cierre, pero JSLint todavía se quejaba. Ahora sé que asumió que utilicé el segundo patrón. –

+0

Ver también [Diferencia entre (función() {})(); y function() {}();] (http://stackoverflow.com/q/423228/1048572) y posible duplicado [¿Ubicación de paréntesis para funciones de JavaScript anónimas de ejecución automática?] (http://stackoverflow.com/ q/3384504/1048572) – Bergi

Respuesta

61

De Douglass Crockford style convention guide: (búsqueda de "invocado inmediatamente")

cuando una función es ser invocado de inmediato, toda la expresión de invocación debe ser envuelto en parens por lo que es claro que el valor de ser producido es el resultado de la función y no la función en sí misma.

Por lo tanto, básicamente, siente que hace más clara la distinción entre los valores de función y los valores de las funciones. Entonces, es una cuestión estilística, no una diferencia sustantiva en el código en sí.

de referencia actualizado, viejo PPT ya no existe

+1

Me alegro de haber leído esto. Acabo de leer Javascript: The Good Parts, y lo que seguía pensando era que asignar el resultado de llamar a una función es una sintaxis realmente mala, porque tienes que mirar la primera y la última línea para comprender lo que está sucediendo. Él no usa el envoltorio parens en el libro, pero veo exactamente por qué los recomienda. – Skilldrick

+2

@altCognito, ¿puede proporcionar un enlace nuevo para el PPT? – th1rdey3

+1

Miré a través de la web, pero todavía no puedo encontrar una copia de ese PPT – Forethinker

1

funciones anónimas inmediatamente llamó a lograr que se envuelven en parens porque:

  1. Son expresiones de función y dejando parens fuera harían que se puede interpretar como una declaración de función que es un error de sintaxis.

  2. Las expresiones de función no pueden comenzar con la función de palabra.

  3. Al asignar la expresión de función a una variable, la función en sí misma no se devuelve, el valor de retorno de la función se devuelve , por lo tanto los paréntesis evalúan lo que hay dentro de ellos y producen un valor. cuando se ejecuta la función, y los parientes finales ..}() hacen que la función se ejecute inmediatamente.

+0

Dathan, estás respondiendo una pregunta diferente. Tiene razón en que los paréntesis adjuntos a veces son sintácticamente necesarios para que el analizador pueda distinguir las expresiones de función de las declaraciones de funciones. Pero mi pregunta es sobre la colocación de los paréntesis de invocación. Tu tercer punto es inexacto; los paréntesis adjuntos son innecesarios en ese caso. –

+0

Estaba respondiendo su primer ejemplo en el que la función anónima llamada inmediatamente no se asignó a una variable y, por lo tanto, los paréntesis son sintácticamente necesarios por las 2 primeras razones. El tercer motivo fue simplemente restablecer lo que dijiste: "el paréntesis de apertura da una indicación inicial de que el valor que se asigna no es la función en sí, sino el resultado de la función que se invoca". Pero creo que no estaba claro. – Dathan

-2

O, utilice:

void function() { 
... 
}() 
Cuestiones relacionadas