2012-05-28 58 views
7

读leaflet.js的代码,我碰到一个方法来与这条线,我不完全理解:多个赋值var a = b = b || {}在JavaScript

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作为参考。引用的值可能是{},但仍然会在修改events时修改this._leaflet_events

相反,写

var events = this._leaflet_events || {}; 

将是一个错误,因为如果没有定义this._leaflet_eventsevents现在将指向一个新创建的对象,其价值将是{}。修改events将更改新对象,但不会更改this._leaflet_events的值。

相同的外观值,不同的参考。这是事情。

+0

仅供参考,'this._leaflet_events'比'this._leaflet不同。 events'。 –

+0

我的错误,我编辑了帖子 – cedricbellet

回答

7

表达较短的将不设置任何为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; 
10

声明var a = b = b || {};确实件事:

  • 它初始化b键{}如果它是不确定的。
  • 它将a设置为与b相同。

表达式a = b || {};不会修改b,因此它不等价。

+0

你没有发现两个变量名的不同 - 请参阅我的答案。 – ThiefMaster

+2

@ThiefMaster:我认为这只是一个错误的问题。检查原始源代码:https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –

相关问题