阅读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 ||无论是否定义了b,{}实际上都是为var分配对b的引用的技巧.修改现在修改b.
回到传单.同
- var events = this._leaflet_events = this._leaflet_events || {};
this._leaflet_events存在或初始化为{}.
事件通过引用分配this._leaflet_events.引用的值可能是{}但仍然是在修改事件时正在修改的this._leaflet_events.
相反,写作
- var events = this._leaflet_events || {};
将是一个错误,因为如果没有定义this._leaflet_events,事件现在将指向一个新创建的对象,其值为{}.修改事件将更改新对象,但不会更改this._leaflet_events的值.
相同的值,不同的引用.这就是事情.
解决方法
较短的表达式不会将任何内容设置为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
第一个陈述实际上相当于
- b = b || {};
- a = b;