2012-05-28 45 views
7

leaflet.js Reading 's, tôi tình cờ gặp một phương pháp với dòng này mà tôi không hoàn toàn hiểu:Nhiều bài tập var a = b = b || {} Trong mã javascript

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

mà có thể được đơn giản hóa như

var a = b = b || {}; 

Từ những gì tôi hiểu hướng dẫn này là một chuyển nhượng thuận tay trái đó là liên kết phù hợp có nghĩa là đầu tiên, JavaScript sẽ chạy

b = b || {} //if b exists, returns b, else return an empty object 

, sau đó

a = b // returns the output of the preceding instruction 

Điều này không có ý nghĩa với tôi. Tại sao không viết thay vì:

a = b || {}; 

Full bối cảnh:

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; 
} 

tôi nghi ngờ một thủ thuật tham khảo vì tôi không thấy như thế nào this._leaflet_events được sửa đổi bởi phương pháp khác.


Suy nghĩ về nó, viết var a = b = b || {} được thực sự là một mẹo để gán var a một tham chiếu đến b, dù b được định nghĩa hay không. Sửa đổi a hiện đang sửa đổi b.

Quay lại Leaflet. Với

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

this._leaflet_events hoặc tồn tại hoặc được khởi tạo để {}. events được gán this._leaflet_events bằng cách tham chiếu. Giá trị của tham chiếu có thể là {} nhưng vẫn là this._leaflet_events đang được sửa đổi khi sửa đổi events.

Ngược lại, viết

var events = this._leaflet_events || {}; 

sẽ là một sai lầm, vì nếu this._leaflet_events không được định nghĩa, events bây giờ sẽ trỏ đến một đối tượng mới được tạo ra có giá trị sẽ được {}. Sửa đổi events sẽ thay đổi đối tượng mới nhưng nó sẽ không thay đổi giá trị của this._leaflet_events.

Cùng một giá trị xuất hiện, tham chiếu khác nhau. Đây là điều.

+0

FYI, 'this._leaflet_events' là khác nhau hơn' this._leaflet. sự kiện'. –

+0

Sai lầm của tôi, tôi đã chỉnh sửa bài đăng – cedricbellet

Trả lời

7

Khái niệm ngắn sẽ không đặt bất cứ điều gì là giá trị b của

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áo cáo kết quả đầu tiên là trong thực tế tương đương với

b = b || {}; 
a = b; 
10

Tuyên bố var a = b = b || {}; không hai điều:

  • Nó khởi tạo b để {} nếu nó đã được xác định.
  • Nó đặt thành giống như b.

Biểu thức a = b || {}; không sửa đổi b sao cho nó không tương đương.

+0

Bạn không phát hiện ra sự khác biệt trong hai tên biến - xem câu trả lời của tôi. – ThiefMaster

+2

@ThiefMaster: Tôi nghĩ đó chỉ là lỗi đánh máy trong câu hỏi. Kiểm tra mã nguồn ban đầu: https://github.com/cvisto/Leaflet/blob/has_clearEventListeners/src/core/Events.js#L23 –

Các vấn đề liên quan