La razón
function() { return val;}();
que no funciona es porque es una función comunicado, no una expresión . Es una distinción bastante menor, pero básicamente, si la instrucción comienza con function
, es como una declaración de función C, y no se puede llamar a la función, porque no hay ningún valor de expresión.
Al agregar los paréntesis, la definición de la función forma parte de una expresión, por lo que tiene un valor y se puede invocar.
La asignación del valor de retorno de la función también elimina la necesidad de paréntesis, porque la definición de la función no es la declaración completa. Por ejemplo, éstas funcionan:
var value = function() { alert("works"); return 0; }();
(function() { alert("works"); })();
pero esto no significa:
function() { alert("doesn't work"); }();
siempre incluyen los paréntesis, incluso cuando no son necesarios, ya que hace que sea más fácil de ver que soy llamando a la función, en lugar de asignarla a una variable.
me pegó +1 –