2012-01-25 41 views
5

Có thể gọi đệ quy một phương thức từ một đối tượng theo nghĩa đen không?Phương thức văn bản đối tượng JavaScript: Gọi đệ quy

Ví dụ:

(function() { 
    'use strict'; 
    var abc = ['A', 'B', 'C'], 
     obj = { 
      f: function() { 
       if (abc.length) { 
        abc.shift(); 
        f(); // Recursive call 
       } 
      } 
     }; 

    obj.f(); 
}()); 

Lỗi: 'f' đã được sử dụng trước khi nó được xác định.

Cảm ơn.

Trả lời

1

Không có biến nào được gọi là f được xác định ở bất kỳ nơi nào trong mã của bạn. Sử dụng obj.f() (hoặc this.f nếu bạn biết this điểm đến nơi cần).

3

f là phương pháp trên đối tượng của bạn. Do đó, khi bạn đang ở trong f, this sẽ là đối tượng được đính kèm f. Vì vậy, để đệ quy gọi f, sử dụng this.f()

f: function() { 
    if (abc.length) { 
     abc.shift(); 
     this.f(); // Recursive call 
    } 
} 

Chỉ cần lưu ý rằng bên trong f, this sẽ chỉ là đối tượng hiện tại nếu f được gọi như một phương pháp: obj.f();

Nếu bạn somethinig như : obj.f.call(lala);, sau đó this giờ sẽ là lala. Và nếu bạn làm điều gì đó như:

var func = obj.f; 
func(); 

Bây giờ this là đối tượng toàn cầu bên trong f (hoặc không xác định trong chế độ nghiêm ngặt)

+0

'this' có thể hoặc không thể trỏ đến 'obj' tùy thuộc vào cách' f' được gọi là. Làm tốt hơn điều này rõ ràng trước khi nó cắn anh chàng sau này. –

+0

@MattiVirkkunen - thực sự - đã chỉnh sửa. Cảm ơn bạn đã tip và thưởng thức các huy hiệu mới của bạn :) –

+0

Yay [!] (Http://stackoverflow.com/questions/9006587/javascript-object-literal-method-recursive-call) –

10

Bạn có thể, bằng cách sử dụng một tên biểu hiện chức năng:

 f: function myself() { 
      if (abc.length) { 
       abc.shift(); 
       myself(); // Recursive call 
      } 
     } 

Phải đọc: http://kangax.github.com/nfe/

+1

Đây phải là câu trả lời đã chọn. Cảm ơn các liên kết quá. – kliron

+0

Chính xác những gì làm cho nó một chức năng được đặt tên làm điều đó phá vỡ erorr? Tạo đóng cửa riêng của nó? –

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