2012-05-28 12 views
7

leaflet.js lettura del', mi sono imbattuto in un metodo con questa linea, che io non comprendo pienamente:Assegnazioni multiple var a = b = b || {} Nel codice javascript

var events = this._leaflet_events = this._leaflet_events || {}; 

che può essere semplificata come

var a = b = b || {}; 

Da quello che ho capito questa istruzione è un compito più mancino che è associativa destra che significa che prima, JavaScript verrà eseguito

b = b || {} //if b exists, returns b, else return an empty object 

, poi

a = b // returns the output of the preceding instruction 

Quale non ha senso per me. Perché non scrivere invece:

a = b || {}; 

contesto completa:

addEventListener: function(/*string*/ type, /*function */ fn, /*(optional) object*/ context){ 
    var events = this._leaflet_events = this._leaflet_events || {}; 
     events[type] = events[type] || {}; 
     events[type].push({ 
     action: fn, 
     context: context || this 
     }); 
    return this; 
} 

ho il sospetto un trucco di riferimento dal momento che non vedo come this._leaflet_events viene modificata dal metodo altrimenti.


Pensandoci bene, la scrittura var a = b = b || {} è in realtà essere un trucco per assegnare var a un riferimento a b, non importa se b è definita o no. La modifica di a ora modifica b.

Torna a Leaflet. Con

var events = this._leaflet_events = this._leaflet_events || {}; 

this._leaflet_events esiste o è inizializzato a {}. events è assegnato a this._leaflet_events come riferimento. Il valore di riferimento potrebbe essere {} ma è ancora this._leaflet_events che viene modificato quando si modifica events.

Al contrario, crei

var events = this._leaflet_events || {}; 

sarebbe un errore, poiché se this._leaflet_events non è definito, events sarà ora puntare a un nuovo oggetto il cui valore sarà {}. La modifica di events cambierà il nuovo oggetto ma non cambierà il valore di this._leaflet_events.

Stessi valori apparenti, riferimenti diversi. Ecco la cosa.

+0

FYI, 'this._leaflet_events' è diverso da' this._leaflet. events'. –

+0

Errore mio, ho modificato il post – cedricbellet

risposta

7

L'espressione più breve non metterà nulla come del b valore

a = b = b || {}; //set b's b value to {} if b is uncdefined, then set a's value to b 

a = b || {}; //set a's value to b, or {} if b is undefined 

la prima affermazione è di fatto equivalente a

b = b || {}; 
a = b; 
10

La dichiarazione var a = b = b || {}; fa due cose:

  • inizializza b per {} se fosse indefinito.
  • Imposta uno uguale a b.

L'espressione a = b || {}; non modifica b, quindi non è equivalente.

+0

Non hai individuato il diverso nei due nomi di variabile - vedi la mia risposta. – ThiefMaster

+2

@ThiefMaster: Penso che sia solo un errore di battitura nella domanda. Controlla il codice sorgente originale: https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –

Problemi correlati