leaflet.js のコードを読んで、完全には理解できないこの行のメソッドに出くわしました:
var events = this._leaflet_events = this._leaflet_events || {};
次のように簡略化できます
var a = b = b || {};
私が理解していることから、この命令は複数の左利きの代入であり、右結合です。つまり、最初に JavaScript が実行されます。
b = b || {} //if b exists, returns b, else return an empty object
、 それから
a = b // returns the output of the preceding instruction
これは私には意味がありません。代わりに書いてみませんか:
a = b || {};
完全なコンテキスト:
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;
}
それ以外の方法でメソッドによってどのように変更されるかがわからないため、参照トリックが疑わthis._leaflet_events
れます。
考えてみれば、が定義されているかどうかに関係なく、実際には への参照をvar a = b = b || {}
割り当てるためのトリックです。変更すると、 が変更されるようになりました。var a
b
b
a
b
リーフレットに戻る。と
var events = this._leaflet_events = this._leaflet_events || {};
this._leaflet_events
が存在するか、 に初期化されてい{}
ます。
events
参照によって割り当てthis._leaflet_events
られます。参照の値は である可能性がありますが、変更時に変更されるの{}
はまだです。this._leaflet_events
events
逆に書くと
var events = this._leaflet_events || {};
this._leaflet_events
が定義されていない場合events
、値が になる新しく作成されたオブジェクトを指すようになるため、間違い{}
です。変更すると新しいオブジェクトが変更されますが、の値events
は変更されません。this._leaflet_events
同じ表示値、異なる参照。これが事です。