Trong sách của Nicholas Zakas, ông giải thích vấn đề tham chiếu vòng tròn khi sử dụng tính toán tham chiếu để thu thập rác trong Javascript. Anh ấy sử dụng ví dụ sau:Tham chiếu tham chiếu trong số tham chiếu Javascript
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
}
giải thích rằng hai đối tượng sẽ không bao giờ có bộ nhớ được phân bổ cho chúng giải phóng vì chúng có hai tham chiếu đến chúng bên trong hàm. Tôi muốn một số làm rõ cách thức hoạt động của nó.
Rõ ràng, có hai tham chiếu đến từng đối tượng. Đối tượng đầu tiên có cả hai ký tự objectA
và objectB.anotherObject
trỏ đến nó. Vì vậy, số lượng tham chiếu cho mỗi đối tượng là 2. Nhưng điều gì sẽ xảy ra khi chức năng được thoát? Điều này không thực sự được mô tả trong cuốn sách. Ông nói rằng số lượng tham chiếu được giảm đi bất cứ khi nào một tham chiếu đến giá trị được ghi đè bằng một giá trị khác. Tôi nghĩ điều này có nghĩa là:
function problem(){
var objectA = new Object();
var objectB = new Object();
objectA.someOtherObject = objectB;
objectB.anotherObject = objectA;
objectA.someOtherObject = objectA; //<-- that if I were to do this,
//the reference count of the first object (A)
//would become 3, and 1 for the second object (B).
}
Nhưng điều gì sẽ xảy ra khi chức năng thoát? Theo tôi hiểu, cả hai số objectA
và objectB
và các thuộc tính tương ứng tham chiếu lẫn nhau sẽ bị hủy và do đó, số lượng tham chiếu của hai đối tượng sẽ bị giảm đi 2. Tôi không thấy "vấn đề tham chiếu vòng tròn" mà Zakas cuộc đàm phán về. Ai đó có thể giải thích những gì anh ta đang cố nói?
Có triển khai nào vẫn dựa trên việc tính tham chiếu không? Theo https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management, các đối tượng này * sẽ bị * phá hủy với tất cả các triển khai hiện đại. – rici
@rici Không, tham khảo đếm - ít nhất là ở dạng ngây thơ của nó - không được sử dụng chính xác vì sự thiếu hụt này và [cần cải tiến] (https://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles). Như MDN nói, tất cả các công cụ hiện đại đều sử dụng một số triển khai đánh dấu và quét. Tuy nhiên, việc đếm tham chiếu vẫn có thể được áp dụng cho các cấu trúc cục bộ cụ thể được biết là không có hoặc không theo chu kỳ, nơi nó có thể hoạt động tốt hơn vì tính đơn giản của nó. – Bergi
vâng, đó là những gì tôi nghĩ. Tôi cho rằng cuốn sách được đề cập đến trong OP có phần ngày tháng, vì tôi tin rằng các phiên bản đầu tiên của MSIE bị vấn đề này. Nhưng ấn tượng của tôi là việc triển khai ES hiện đại sẽ thu thập chính xác cả hai đối tượng trong ví dụ này. Tôi hiểu rằng câu hỏi là giải thích vấn đề với các tham chiếu vòng tròn trong một môi trường được tính toán lại nhưng chắc chắn điều đáng nói đến trong câu trả lời là vấn đề không còn tồn tại trong thực tế; không cần phải tự phá vỡ chu kỳ tham chiếu, trái với lời khuyên bạn vẫn sẽ tìm thấy trôi nổi xung quanh. – rici