Domanda

quando codice:

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

questa espressione è valutata nel seguente ordine?

  1. definisce la funzione;
  2. passa il puntatore di riferimento a
  3. viene richiamato a ()
  4. restituisce un nuovo puntatore a funzione
  5. viene nuovamente richiamato a ()

e in tal caso perché ho un errore di sintassi se lo faccio:

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

l'interprete vuole prima un operando di sinistra ...

ma questa sintassi funziona:

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

)()

la parentesi esterna cosa significa ???

Grazie

È stato utile?

Soluzione

È la sintassi della lingua. Se si desidera eseguire sul posto una funzione anonima, è necessario racchiuderla tra parentesi.

JS ha questi casi limite in cui la sintassi è più strana di quanto ti aspetti. Prendiamo ad esempio la valutazione di una stringa che ha un JSON non funziona se non è racchiusa tra parentesi.

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

È la sintassi della lingua.

Detto questo, penso (e questo è strettamente IMHO), i passaggi che hai delineato non sono accurati.

  1. La funzione è definita e invocata. avviso (" 44 "); succede di conseguenza.
  2. La funzione restituisce un'altra funzione che viene anche invocata. avviso (" 33 "); accade.
  3. La funzione più interna non restituisce nulla, quindi a è effettivamente indefinito. tipo di a restituisce "non definito".

Altri suggerimenti

  1. function () {alert (" 44 ") return function () {alert (33)}} definisci la funzione
  2. function () {alert (" 44 ") return function () {alert (33)}} () si chiama quella funzione che restituisce la funzione anonima function(){alert(33)}
  3. function () {alert (" 44 ") return function () {alert (33)}} () () chiamate la funzione restituita, quindi in realtà è equivalente a function(){alert(33)}()

Quindi l'intera esecuzione equivale a:

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

sto imparando anche funzioni auto-invocanti.
e penso che il codice dovrebbe essere 3. (function () {alert (" 44 "); return function () {alert (33);}}) () ()

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top