2012-07-20 53 views
13

Tại sao chúng tôi không thể trực tiếp sử dụng this thay vì self trong ví dụ sau?Tại sao chúng ta cần "var self = this" trong các lớp trong Javascript?

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 
} 

Sau phản ứng, tôi đã học được:

Vâng, không có nhu cầu nếu không có chuyển đổi bối cảnh trong lớp.

Nhưng tôi sẽ sử dụng phương pháp này là "quy ước" mặc dù không cần thiết.

Trả lời

21

không lý do tại sao bạn không thể sử dụng this trực tiếp ở đó (và tôi sẽ nói nó sẽ được tốt hơn để có thể đọc nếu bạn đã).

Tuy nhiên, var self = this; thường cần thiết trong những tình huống như sau (về cơ bản, bất kỳ hành động không đồng bộ như sự kiện ràng buộc, xử lý AJAX vv, nơi mà các nghị quyết của this được hoãn lại cho đến khi nó bằng cái gì khác);

function SeatReservation(name, initialMeal) { 
    var self = this; 
    self.name = name; 
    self.meal = ko.observable(initialMeal); 

    setTimeout(function() { 
     alert(self.name); // otherwise, this is window; use self to keep a reference to the "SeatReservation" instance. 
    }, 100); 
} 
+0

Liệu setTimeout chạy trong constructor? Hay là phương pháp của lớp? – ozz

+0

@ozz: Xem tài liệu cho ['window.setTimeout'] (https://developer.mozilla.org/en/DOM/window.setTimeout); nó trì hoãn việc thực hiện hàm được cung cấp cho số mili giây được chỉ định. – Matt

+0

Chưa kể, setTimeout cũng cho phép bạn chuyển một tham số. ví dụ: http://jsfiddle.net/gRoberts/rYB3f/ trong ví dụ của bạn, sẽ loại bỏ nhu cầu redeclare 'this' là 'self'. – Gavin

3

Dựa trên ví dụ của bạn, không có lý do gì để thực hiện việc này.

Tuy nhiên, các trường hợp sẽ giúp bạn, mặc dù một số có thể cau mày khi sử dụng.

ví dụ:

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       $(this).removeClass('busy'); 
      }, 
      error : function() 
      { 
       $(this).removeClass('busy');     
      } 
     }); 
    } 
}); 

Ở phía trên, $(this) trong sự thành công và lỗi callbacks sẽ không phản ánh để liên kết mà bạn nhấp, như phạm vi đã bị mất.

Để làm được việc này, bạn sẽ làm gì var self = $(this) ví dụ:

$('a.go').click(function(e) 
{ 
    e.preventDefault(); 
    if(!$(this).hasClass('busy')) 
    { 
     $(this).addClass('busy'); 
     var btn = $(this); 
     $.ajax(
     { 
      success : function(resp) 
      { 
       btn.removeClass('busy'); 
      }, 
      error : function() 
      { 
       btn.removeClass('busy');     
      } 
     }); 
    } 
}); 
+5

mặc dù bạn tất nhiên là kỹ thuật chính xác, câu trả lời như thế này rắc rối cho tôi một chút: ** jQuery! = Javascript **!Trả lời một câu hỏi javascript rộng với cú pháp jQuery có thể gây nhầm lẫn cho người mới bắt đầu. – cypherabe

+0

Tuy nhiên, người mới bắt đầu của bạn hiếm khi học javascript gốc, họ có xu hướng tìm kiếm giải pháp của Google, trong hầu hết các trường hợp, kết quả là sử dụng jQuery. Đó là một thanh kiếm hai lưỡi. Nếu tôi đã đưa ra một ví dụ javascript bản địa, một người chỉ biết jQuery dựa trên javascript sẽ bị nhầm lẫn. – Gavin

+0

javascript gốc JQuery IS. Nó không phải là xử lý DOM gốc mặc dù. Sự nhầm lẫn chạy sâu. – frostymarvelous

5

Trong ví dụ mã của bạn không có lý do nào cả để sao chép this cho một biến.

Nó thường được sử dụng khi mã sử dụng phương thức gọi lại. Bên trong phương thức gọi lại this không tham chiếu đối tượng, vì vậy bạn sử dụng biến cho điều đó.

7

Nó thường được thực hiện để giữ một tham chiếu đến điều này khi bối cảnh đang thay đổi. Nó thường được sử dụng trong các trình xử lý sự kiện hoặc các hàm gọi lại. Nhưng như đã đề cập ở trên, không có lý do gì để sử dụng nó trong ví dụ cụ thể của bạn.

Bạn sẽ tìm thấy thêm chi tiết trong bài viết sau đây: http://www.alistapart.com/articles/getoutbindingsituations

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