Pregunta

cuando codifico:

var a =
function()
{
    alert("44")
    return function(){alert(33)}
}()();

¿se evalúa esta expresión en el siguiente orden?

  1. define la función;
  2. pasar su puntero de referencia a un
  3. se invoca a ()
  4. regresar en un nuevo puntero de función
  5. a () se invoca nuevamente

y si es así, ¿por qué tengo un error de sintaxis si lo hago:

function()
{
    alert("44")
    return function(){alert(33)}
}();

el intérprete quiere un operando izquierdo primero ...

pero esta sintaxis funciona:

(
  function()
  {
    alert("44")
    return function(){alert(33)}
  };

)()

el paréntesis externo, ¿qué significa ???

Gracias

¿Fue útil?

Solución

Es la sintaxis del lenguaje. Si desea ejecutar in situ una función anónima, debe encerrarla entre paréntesis.

JS tiene estos casos de borde donde la sintaxis es más extraña de lo que esperas. Por ejemplo, evaluar una cadena que tiene un JSON no funciona a menos que esté envuelto con parens.

// Wrong
eval("{ ... }");
// Right
eval("({ ... })");

Es la sintaxis del lenguaje.

Dicho esto, creo (y esto es estrictamente IMHO), los pasos que ha descrito no son precisos.

  1. La función está definida e invocada. alerta (" 44 "); sucede como resultado.
  2. La función devuelve otra función que también se invoca. alerta (" 33 "); sucede.
  3. La función más interna no devuelve nada, por lo que a está efectivamente indefinida. typeof a devuelve " indefinido " ;.

Otros consejos

  1. function () {alert (" 44 ") return function () {alert (33)}} define la función
  2. función () {alert (" 44 ") función de retorno () {alert (33)}} () llama a esa función que devuelve una función anónima function(){alert(33)}
  3. función () {alert (" 44 ") función de retorno () {alert (33)}} () () se llama función devuelta, por lo que en realidad es equivalente a function(){alert(33)}()

Entonces, toda la ejecución es equivalente a:

alert("44"); alert(33);

También estoy aprendiendo funciones de auto-invocación, también.
y creo que el código debería ser 3. (function () {alert (" 44 "); return function () {alert (33);}}) () ()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top