阅读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
。回到Leaflet。
var events = this._leaflet_events = this._leaflet_events || {};
this._leaflet_events
要么存在,要么被初始化为 {}
。
events
通过引用分配给了 this._leaflet_events
。该引用的值可能是 {}
,但修改 events
时仍然修改的是 this._leaflet_events
。
相反地,如果写成:
var events = this._leaflet_events || {};
如果不定义this._leaflet_events
,那么将是一个错误,因为events
现在将指向一个新创建的对象,其值为{}
。修改events
会改变新对象,但不会改变this._leaflet_events
的值。
相同的表面值,不同的引用。这就是事情的本质。
this._leaflet_events
与this._leaflet.events
是不同的。 - Derek 朕會功夫