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.
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. –
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