Circular reference xảy ra khi 2 object tham chiếu lẫn nhau (A→B, B→A).
Tác hại
- Trên trình duyệt cũ: gây rò rỉ bộ nhớ (memory leak) do GC tham chiếu đếm (reference-counting) không xử lý được chu trình.
- GC hiện đại (mark-and-sweep) đã xử lý tốt chu trình — không còn leak.
- Tuy nhiên, từ góc độ thiết kế: code smell, coupling chặt, thay đổi một object kéo theo object kia.
Ví dụ
let dog = new Dog(); let person = new Person(); dog.owner = person; person.pet = dog; // circular
Giải pháp
- Chỉ giữ 1 chiều tham chiếu (ví dụ:
dog.owner), truy xuất ngược qua ID/map khi cần. - Dùng
WeakMapđể map ngược mà không cản trở GC. - Nếu thực sự cần 2 chiều — chấp nhận, GC hiện đại xử lý tốt.
Nguyên tắc: Ưu tiên thiết kế đơn hướng, tránh coupling không cần thiết.