2012-05-28 17 views
7

leaflet.js Lectura 's, me encontré con un método con esta línea que no entiendo plenamente:Asignaciones múltiples var a = b = b || {} En código javascript

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

que se puede simplificar como

var a = b = b || {}; 

De lo que entiendo esta instrucción es una asignación múltiple zurdo que es asociativa derecha lo que significa que en primer lugar, se ejecutará JavaScript

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

, a continuación,

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

Lo que no tiene sentido para mí. Por qué no escribir en su lugar:

a = b || {}; 

contexto completo:

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; 
} 

sospecho un truco de referencia, puesto que no veo cómo this._leaflet_events es modificado por el método de lo contrario.


Pensando en ello, la escritura var a = b = b || {} es en realidad ser un truco para asignar var a una referencia a b, no importa si b se define o no. Modificar a ahora modifica b.

Volver al Folleto. Con

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

this._leaflet_events ya sea que exista o se inicializa a {}. events se asigna this._leaflet_events por referencia. El valor de la referencia podría ser {} pero sigue siendo this._leaflet_events que se está modificando al modificar events.

Por el contrario, la escritura

var events = this._leaflet_events || {}; 

sería un error, ya que si no se define this._leaflet_events, events ahora apuntará a un objeto de nueva creación cuyo valor será {}. La modificación de events cambiará el nuevo objeto pero no va a cambiar el valor this._leaflet_events 's.

valores appearent mismos, diferentes referencias. Aquí está la cosa.

+0

FYI, 'this._leaflet_events' es diferente de' this._leaflet. eventos'. –

+0

Mi error, edité la publicación – cedricbellet

Respuesta

7

La expresión más corto no se coloque ningún objeto como valor de b

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 primera afirmación es de hecho equivalente a

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

La declaración var a = b = b || {}; hace dos cosas:

  • inicializa b para {} si era indefinido.
  • Se establece un a la misma como b.

La expresión a = b || {}; no modifica b por lo que no es equivalente.

+0

No identificó los diferentes nombres de las dos variables: vea mi respuesta. – ThiefMaster

+2

@ThiefMaster: Creo que es solo un error en la pregunta. Compruebe el código fuente original: https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –

Cuestiones relacionadas