2012-05-28 26 views
7

Reading leaflet.js „s, natknąłem się na metody z tej linii, które nie w pełni zrozumieć:Przypisanie wielokrotne var a = b = b || {} W javascript kod

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

które można uprościć

var a = b = b || {}; 

Od co rozumiem tej instrukcji jest wielokrotnością przypisanie leworęczny, że ma rację asocjacyjne co oznacza, że ​​po pierwsze, JavaScript będzie działać

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

, a następnie

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

Co nie ma dla mnie sensu. Dlaczego nie napisać zamiast:

a = b || {}; 

Pełny kontekst:

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

Podejrzewam trick odniesienia ponieważ nie widzę jak this._leaflet_events zostanie zmodyfikowany metodą inaczej.


Myśląc o tym, pisząc var a = b = b || {} faktycznie być podstęp przypisać var a odniesienie do b, bez względu na to, czy b jest zdefiniowana lub nie. Modyfikowanie a modyfikuje teraz b.

Powrót do ulotki. Z

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

this._leaflet_events albo istnieje lub jest inicjowane {}. events jest przypisane this._leaflet_events przez odniesienie. Wartość odniesienia może wynosić {}, ale nadal jest modyfikowana podczas modyfikowania events.

Wręcz przeciwnie, pisanie

var events = this._leaflet_events || {}; 

byłoby błędem, ponieważ jeśli this._leaflet_events nie jest zdefiniowana, events będzie teraz wskazywać na nowo utworzonego obiektu, którego wartość będzie {}. Modyfikowanie events spowoduje zmianę nowego obiektu, ale nie zmieni on wartości this._leaflet_events.

Takie same atrakcyjne wartości, różne odniesienia. O to chodzi.

+0

FYI, 'this._leaflet_events' jest inna niż' this._leaflet. wydarzenia ". –

+0

Mój błąd, zredagowałem wpis – cedricbellet

Odpowiedz

7

Krótsza wyrażenie nie ustawi wszystko jako wartość 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 

pierwsze twierdzenie jest w rzeczywistości odpowiednik

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

Oświadczenie var a = b = b || {}; robi dwa rzeczy:

  • inicjalizuje To b {} czy to nieokreślone.
  • Ustawia to samo, co b.

Wyrażenie a = b || {}; nie zmienia b, więc nie jest równoważne.

+0

Nie zauważyłeś różnych w dwóch nazwach zmiennych - zobacz moją odpowiedź. – ThiefMaster

+2

@ThiefMaster: Myślę, że to tylko literówka w pytaniu. Sprawdź oryginalny kod źródłowy: https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –

Powiązane problemy