Ho modificato la mia risposta a causa di commenti e altre risposte.
L'operatore di assegnazione non restituisce nulla ... Nell'esempio seguente, la prima cosa che fa il parser JS è assegnare da 5 a y. La seconda cosa è assegnare y a x, e così via. L'assegnazione non è return
(non è una funzione, e in JS non ha la sintassi C++ per sovraccaricare il comportamento dell'operatore). return
è più complesso del compito. Il costrutto return
non restituisce solo un valore, ma sta chiudendo il contesto corrente causandone la distruzione. Inoltre sta chiudendo qualsiasi contesto genitore (schema di chiusura) se non ci sono altri bambini che lo usano. Quindi, per favore, NON dirmi (nei commenti) che l'operatore di assegnazione restituisca alcun valore. L'operatore di assegnazione in caso di JS è solo un costrutto linguistico.
Questo costrutto del linguaggio è utile in catene (ed è per questo che tutti parlano di ritorno):
a = x = y = 5;
Qualsiasi variabile non dichiarata è dichiarata automaticamente dal parser in ambito globale.Se si dichiara variabile in modo esplicito, allora non si può allo stesso tempo utilizzare in catena, in questo modo:
a = var x = y = 5;
L'uso corretto del codice di cui sopra sarebbe:
var x = y = 5;
a = x;
Naturalmente è possibile utilizzare parentesi, per rendere più chiaro il tuo codice, ma ciò non significa che il codice si comporti come una funzione.
Anche l'esempio funziona solo con la console JS, che non viene restituita, ma stampando il risultato di istruzioni o espressioni. Significa che la console JS considera il risultato della dichiarazione della variabile come undefined
(uguale alla creazione della funzione: function a() {}
).
possibile duplicato di [Differenza tra l'utilizzo di var e non l'utilizzo di var in JavaScript] (http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var-in-javascript). Dai un'occhiata alla risposta di kangax. "' var x = 1' dichiara la variabile 'x' nell'attuale scope (noto anche come contesto di esecuzione) ....' x = 1', d'altra parte, è semplicemente un assegnamento di proprietà, ma prima cerca di risolvere 'x' contro scope chain.Se lo trova ovunque in quella catena di scope, esegue un assegnamento, se non trova 'x', solo allora crea la proprietà' x' su un oggetto globale. " – Chase
che interessante .. Non l'ho mai notato! – anthonybell
Penso che 'x = 5' sia un'espressione in grado di restituire un valore, mentre' var x = 5' è un'asserzione che non lo è. Ciò è più evidente dal fatto che non è possibile dichiarare variabili in linea, cioè 'console.log (var x = 5)'. Da dove ottieni il valore di ritorno di "non definito"? –