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.
FYI, 'this._leaflet_events' jest inna niż' this._leaflet. wydarzenia ". –
Mój błąd, zredagowałem wpis – cedricbellet