Explicar la sintaxis de la función anónima encapsulada


Resumen

¿Puede explicar el razonamiento detrás de la sintaxis para funciones anónimas encapsuladas en JavaScript? ¿Por qué funciona esto: (function(){})(); pero esto no: function(){}();?


Lo que sé

En JavaScript, se crea una función con nombre como esta:

function twoPlusTwo(){
    alert(2 + 2);
}
twoPlusTwo();

También puede crear una función anónima y asignarla a una variable:

var twoPlusTwo = function(){
    alert(2 + 2);
};
twoPlusTwo();

Puede encapsular un bloque de código creando una función anónima, luego envolviéndola entre corchetes y ejecutándola inmediatamente:

(function(){
    alert(2 + 2);
})();

Esto es útil al crear scripts modularizados, para evitar saturar el ámbito actual, o el ámbito global, con variables potencialmente conflictivas , como en el caso de los scripts de Greasemonkey, los complementos de jQuery, etc.

Ahora, entiendo por qué esto funciona. Los corchetes encierran el contenido y exponen solo el resultado (estoy seguro de que hay una mejor manera de describirlo), como con (2 + 2) === 4.


Lo que no entiendo

Pero yo no entiende por qué esto no funciona igual de bien:

function(){
    alert(2 + 2);
}();

¿Puedes explicarme eso?


Warning: Undefined property: agent_blog_content::$date_asked in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 32

Warning: Undefined property: agent_blog_content::$count_answers in /var/www/agent_etc/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 52