Hay una opción JSLint , una de las partes buenas de hecho, que "[requiere] parens alrededor de invocaciones inmediatas", lo que significa que la construcción
(function () {
// ...
})();
en su lugar, debería escribirse como
(function () {
// ...
}());
Mi pregunta es esta: ¿alguien puede explicar por qué esta segunda forma podría considerarse mejor? ¿Es más resistente? ¿Menos propenso a errores? ¿Qué ventaja tiene sobre la primera forma?
Desde que hice esta pregunta, he llegado a comprender la importancia de tener una distinción visual clara entre los valores de las funciones y los valores de las funciones. Considere el caso en el que el resultado de la invocación inmediata es el lado derecho de una expresión de asignación:
var someVar = (function () {
// ...
}());
Aunque los paréntesis más externos son sintácticamente innecesarios, 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.
Esto es similar al consejo de Crockford con respecto a la capitalización de las funciones del constructor: está destinado a servir como una pista visual para cualquiera que esté mirando el código fuente.
fuente
Respuestas:
De la guía de convenciones de estilo de Douglass Crockford : (busque "invocado inmediatamente")
Cuando una función debe invocarse inmediatamente, toda la expresión de invocación debe estar envuelta en parens para que quede claro que el valor que se produce es el resultado de la función y no la función en sí.
Entonces, básicamente, él siente que hace más clara la distinción entre los valores de las funciones y los valores de las funciones. Entonces, es una cuestión de estilo, no realmente una diferencia sustancial en el código en sí.
referencia actualizada, el PPT antiguo ya no existe
fuente
Las funciones anónimas llamadas inmediatamente se envuelven en parens porque:
Son expresiones de función y dejar de lado los parens haría que se interpretara como una declaración de función que es un error de sintaxis.
Las expresiones de función no pueden comenzar con la palabra función.
Al asignar la expresión de la función a una variable, la función en sí no se devuelve, se devuelve el valor de retorno de la función
, por lo tanto, los padres evalúan lo que hay dentro y producen un valor.cuando se ejecuta la función, y los parens finales..}()
hacen que la función se ejecute inmediatamente.fuente
O usar:
fuente