7

阅读 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引用的技巧。修改现在修改.bbab

回到传单。和

    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' 值。

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

4

2 回答 2

10

该声明var a = b = b || {};了两件事:

  • {}如果 b 未定义,则将其初始化为。
  • 它将 a 设置为与 b 相同。

该表达式a = b || {};不修改 b 所以它不等价。

于 2012-05-28T22:07:47.383 回答
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;
于 2012-05-28T22:10:02.313 回答