2013-04-04 5 views
10

Perché il seguente codice avvisa 2?Perché il risultato di due definizioni di funzione è unito da una virgola?

var f = (function x(){ return 1; }, function y(){ return 2; })(); 
alert(f); 

Quello che posso vedere è che in qualche modo la funzione y è sempre eseguito e x funzione viene ignorata. (Ho fatto in modo che ho messo alert in entrambe le funzioni, e solo il alert in y si chiama, che mi fanno credere che la funzione x non viene chiamato a tutti)

E se tolgo la funzione y allora avvisi 1.

Cosa sta succedendo?

risposta

14

Ok, rompiamolo un po '.

(function x(){ return 1; }, function y(){ return 2; }) 

è di due funzioni literals.Next il comma operator viene utilizzato. Valuta le espressioni (entrambe le funzioni) e restituisce l'ultimo. il risultato di questa espressione è: function y(){ return 2; }

Il che significa l'espressione che rimane è: var f = (function y(){ return 2; })();

La prossima cosa che facciamo è chiamare (con la ()), che restituisce 2 nella variabile f;

+0

Grazie amico, non so come accettare 2 risposte ci dovrebbe essere una tale opzione. quindi ti inviterò. –

+0

Bene, anche l'altra risposta è buona. Ad essere sinceri, la mia risposta è stata prima di alcuni minuti, si collega alla stessa identica risorsa ma la spiega invece di citarla, e penso che dia una spiegazione migliore al problema, questa è solo la mia opinione. –

+0

Mi dispiace amico, ho accettato altra risposta a causa di solo 1 motivo e che è sul mio schermo posso vedere la risposta accettata è 2 minuti prima del tuo. Quindi non sono sicuro di cosa fare, sono confuso :( –

5

Quando si utilizza il comma operator, il valore restituito è quello dell'ultimo elemento, nel tuo caso, la funzione y() (che restituisce 2)

Dalla documentazione di Mozilla:

L'operatore virgola valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore del secondo operando.

È possibile utilizzare l'operatore virgola quando si desidera includere più espressioni in una posizione che richiede una singola espressione. Il maggior numero di uso comune di questo operatore è di fornire più parametri in un ciclo per loop.