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 abbab

リーフレットに戻る。と

    var events = this._leaflet_events = this._leaflet_events || {};

this._leaflet_eventsが存在するか、 に初期化されてい{}ます。 events参照によって割り当てthis._leaflet_eventsられます。参照の値は である可能性がありますが、変更時に変更されるの{}はまだです。this._leaflet_eventsevents

逆に書くと

    var events = this._leaflet_events || {};

this._leaflet_eventsが定義されていない場合events、値が になる新しく作成されたオブジェクトを指すようになるため、間違い{}です。変更すると新しいオブジェクトが変更されますが、の値eventsは変更されません。this._leaflet_events

同じ表示値、異なる参照。これが事です。

4

2 に答える 2

10

このステートメントvar a = b = b || {};は、次の 2 つのことを行います。

  • {}未定義の場合は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 に答える