Domanda
quando codice:
var a =
function()
{
alert("44")
return function(){alert(33)}
}()();
questa espressione è valutata nel seguente ordine?
- definisce la funzione;
- passa il puntatore di riferimento a
- viene richiamato a ()
- restituisce un nuovo puntatore a funzione
- 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
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.
- La funzione è definita e invocata. avviso (" 44 "); succede di conseguenza.
- La funzione restituisce un'altra funzione che viene anche invocata. avviso (" 33 "); accade.
- La funzione più interna non restituisce nulla, quindi a è effettivamente indefinito. tipo di a restituisce "non definito".
Altri suggerimenti
-
function () {alert (" 44 ") return function () {alert (33)}}
definisci la funzione -
function () {alert (" 44 ") return function () {alert (33)}}
()
si chiama quella funzione che restituisce la funzione anonimafunction(){alert(33)}
-
function () {alert (" 44 ") return function () {alert (33)}} ()
()
chiamate la funzione restituita, quindi in realtà è equivalente afunction(){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);}}) () ()