阅读 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 || {};
将是一个错误,因为 ifthis._leaflet_events
没有定义,events
现在将指向一个新创建的对象,其值为{}
. 修改events
将更改新对象,但不会更改this._leaflet_events
' 值。
相同的外观值,不同的参考。事情就是这样。