2012-10-31 38 views
6

Điều gì đó luôn làm phiền tôi về cách tôi viết mã hướng đối tượng trong Javascript. Khi có một cuộc gọi lại, tôi thường xuyên muốn tham khảo các đối tượng mà ban đầu được gọi là chức năng, dẫn tôi làm điều gì đó như thế này:Tham chiếu "này" từ trong một cuộc gọi lại javascript

MyClass.prototype.doSomething = function(obj, callback) { 
    var me = this; // ugh 
    obj.loadSomething(function(err, result) { 
     me.data = result; // ugh 
     callback(null, me); 
    }); 
} 

Trước hết, tạo biến thêm nhất luôn có vẻ ... quá mức đối với tôi. Hơn nữa, tôi phải tự hỏi nếu nó có thể sẽ gây ra vấn đề (tham chiếu vòng tròn? Un-GCd đối tượng?) Bằng cách đi qua biến "tôi" trở lại gọi lại.

Có cách nào tốt hơn để thực hiện việc này không? Phương pháp này có tệ không?

+1

'this' không phải là biến. 'này' không thể được đóng lại. Cách tiếp cận là tốt. –

+1

FUD về "điều ác" và "quá mức" làm phiền tôi. Không sao nếu không thích lò hơi nhưng tại sao lại tạo ra những vấn đề tưởng tượng với nó? Bạn cần giữ lại tham chiếu đến cùng một dữ liệu kèm theo cho dù bạn sử dụng phương pháp nào, vì hàm bên trong không thay đổi. Cho dù bạn sẽ chỉ giữ một tham chiếu đến các dữ liệu ít nhất cần thiết là một cái gì đó mà thông dịch viên phải lo lắng. – millimoose

+0

@millimoose Vâng nói - tôi đã không nghĩ ra một cách để tóm tắt dòng cuối cùng đó. (Và tôi vẫn chạy vào "cái ác" - cũng không phải là "tà ác", nhưng thực sự khủng khiếp theo cách rất khách quan - mã sử dụng 'hàm mới (" .. ")' để "tránh các vấn đề".) –

Trả lời

8

Đây là những gì Function.bind() dành cho:

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething((function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }).bind(this)); 
} 
+3

Có thể muốn thay đổi 'me' thành' this' – Shmiddty

+0

@ Schmiddty Rất tiếc, bắt tốt. – millimoose

+0

+1 cho câu trả lời hay, câu trả lời được chấp nhận cho liên kết tài liệu. –

7

AFAIK, những gì bạn đang làm là mẫu được chấp nhận cho loại điều này và không gây ra bất kỳ sự cố nào. Rất nhiều người sử dụng hoặc là "tự" hoặc "đó" như là tài liệu tham khảo được lưu trữ - "tự" có thể trực quan hơn nếu bạn đến từ một nền python.

+2

Tôi thích 'self'. Tuy nhiên có * là * cũng 'window.self' .. mặc dù tôi chưa bao giờ gặp rắc rối về vấn đề này. –

+0

Và đôi khi bạn có thể nhầm lẫn với [window.self] (https://developer.mozilla.org/en-US/docs/DOM/window.self) – epascarello

3

Đây là hành vi bình thường đối với JavaScript. Bối cảnh cho this đã thay đổi đối tượng loadSomething và lý do gọi lại là để nắm bắt các tham chiếu đóng cửa như biến số me của bạn.

3

Bạn có thể liên kết này với phạm vi chức năng bên trong

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething(function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }.bind(this)); 
} 
1

Đây là cách phổ biến nhất mà tôi đã thấy để xử lý nó, tôi thường sử dụng var self = this ;, nhưng nó chỉ là một cái tên. Mặc dù nó là một biến phụ, xem xét chi phí javascript và thực tế là nó không trùng lặp đối tượng, nó thực sự sẽ không ảnh hưởng đến hiệu suất.

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