2012-05-14 26 views
12

Tôi đang đọc nguồn từ mongooseTại sao gán `này` thành` self` và chạy `self.method()`?

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    self.doQueue(); 
}; 

Tôi không hiểu tại sao tác giả gán this để self và chạy self.doQueue(). Tại sao không chỉ chạy:

this.buffer = false; 
this.doQueue(); 

Tôi mới tham gia javascript, cảm ơn bạn đã trợ giúp.

Trả lời

14

Bạn nói đúng, trong trường hợp này, họ có thể chỉ cần sử dụng this.

Việc sử dụng me hoặc self là một chút của một hack để đảm bảo bối cảnh đúng this được sử dụng, như trong JavaScript phạm vi this là biến thể. Nếu ví dụ bạn có một sự kiện kích hoạt một hàm trong lớp của bạn, this sẽ khác, và sẽ không phải là đối tượng của bạn có chứa hàm, mà thay vào đó là đối tượng được gọi là hàm. Để giải quyết những người này thường sử dụng me hoặc self để đảm bảo họ đang đề cập đến đối tượng chính xác ... this, như trong đối tượng thực tế.

-1

bản thân là bản sao của 'this', nhưng nó luôn đề cập đến đúng đối tượng và 'this' có thể không.

+0

Nó sẽ trừ khi bạn tạo ra một phạm vi chức năng mới. – ThiefMaster

+2

Đây là một tay * vẫy tay * trả lời mà không có ví dụ và không phải là lời giải thích * thực *. – Matt

2

Lý do duy nhất bạn thường làm là nếu cuộc gọi đến doQueue() nằm trong một khối sẽ thay đổi giá trị this chẳng hạn như một chức năng khác.

Trong trường hợp này, tuy nhiên, nó không phục vụ bất kỳ mục đích nào và có lẽ là phần còn lại của mã cũ hơn mà không bị thay đổi trở lại.

2

Rất có thể nhà phát triển muốn nhất quán, nhưng không thành công khi thực hiện như vậy.

Nếu không, bạn muốn được sử dụng this trong một số chức năng, self trong các chức năng khác và a mix of both trong các chức năng khác, tùy thuộc vào nơi bạn sử dụng các đối tượng và nếu bạn sử dụng chức năng lồng/callbacks.

Bằng always assigning this to self và sau đó sử dụng sau này bạn có một nhiệm vụ bổ sung ở đầu mỗi chức năng nhưng bạn luôn luôn sử dụng self để truy cập đối tượng.

Tuy nhiên, những gì nhà phát triển đã làm trong mã bạn đăng không có ý nghĩa nhiều. Anh ta nên sử dụng self hoặc this cả hai lần thay vì kết hợp thậm chí không cần thiết.

+0

... nhưng trong dòng trên, anh ta đang làm 'this.buffer = false;'. – Matt

2

Chỉ cần để cho rõ ràng hơn để @ Richard đã nói trước đó,

Collection.prototype.onOpen = function() { 
    var self = this; 
    this.buffer = false; 
    this.onclick = function(){ 
    //do some other operations here 
    //if you refer `this` here then, `this` will refer to present function not the above. so to make sure it is referring to exact object people pass this to `me` or `self` 
    self.doQueue(); 
    } 
}; 
+1

bạn có thể đề xuất chỉnh sửa cho câu trả lời của mình thay vì làm lộn xộn bài đăng, cảm ơn bạn. –

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