2015-02-17 13 views
5

Tôi đang xây dựng một trò chơi javascript tạo ra một 'mức' đối tượng sử dụng var:Làm thế nào để phát hiện nếu một đối tượng đã được thu thập rác trong Javascript?

function start() { 
    var myGameLevel = new Level(2); 
} 

"Cấp()" Đối tượng này có rất nhiều chức năng, chủ yếu là bổ sung thêm các yếu tố để DOM và làm cho chúng tương tác. Đơn giản hóa:

function Level(i) { 
    var _difficulty = i; 

    this.init = function(){ 
     jQuery("#container").append(...game elements here...); 
     jQuery("#button").on('click', function() {...}); 
    } 
} 

Câu hỏi của tôi: làm cách nào để biết đối tượng Cấp được tạo trong chức năng 'bắt đầu' có bị thu gom rác hay không? Tôi nhằm mục đích chỉ sử dụng các biến "var" để không có tham chiếu bên ngoài. Khi DOM bị xóa khỏi tất cả các phần tử trò chơi, tôi EXPECT đối tượng 'cấp' được giải phóng khỏi bộ nhớ, nhưng làm cách nào tôi có thể chắc chắn?

+0

Nếu bạn đang sử dụng Chrome, bạn đã thử định dạng bộ nhớ trong trình gỡ rối chưa? – dowomenfart

+0

Vâng, tôi không chắc chắn nên tìm gì? Vì toàn bộ đối tượng Cấp là ẩn danh? Trình gỡ lỗi Chrome có rất nhiều màn hình, danh sách và tùy chọn. Tôi sẽ tìm đối tượng "Cấp độ" ở đâu? – Kokodoko

+0

@Kokodoko bạn có gặp bất kỳ giải pháp nào không? –

Trả lời

3

Tôi không nghĩ rằng bạn có thể kiểm soát bộ sưu tập rác JavaScript. Thông thường một biến hoặc đối tượng có thể được thu thập nếu không có tham chiếu đến nó. Vì vậy, bạn có thể tăng cơ hội của bạn có một đối tượng thu thập được bằng cách thiết kế logic của bạn để làm cho đối tượng đi ra khỏi phạm vi.

+0

Tôi không cần phải kiểm soát nó, tôi chỉ muốn biết nếu đối tượng đã được GC'ed hay không. Vì toàn bộ điều là vô danh, tôi không thể truy cập nó trong bảng điều khiển hoặc trong mã, nhưng nó vẫn có thể tồn tại. – Kokodoko

5

Tham khảo yếu are considered a security risk và do đó không có sẵn cho mã không có đặc quyền trong trình duyệt.

Những mối quan tâm đó không áp dụng cho mã đặc quyền hoặc thực thi javascript trên máy chủ, ví dụ: thông qua node.js và do đó việc triển khai tham chiếu yếu dành riêng cho nền tảng có thể có sẵn cho chúng.
Ví dụ: firefox addons có thể sử dụng Components.utils.getWeakReference()

Đối với các mẫu lập trình nhất định WeakMap/WeakSet có thể là đủ, chúng không cho phép chương trình quan sát bộ sưu tập rác. khóa sẽ ngăn không cho các đối tượng được thu thập ngay từ đầu.

Một mối quan tâm khác được lồng tiếng bởi người triển khai JS là tùy thuộc vào mức độ mạnh mẽ của một API ref giả định yếu sẽ là - ví dụ: cung cấp thông báo hoàn thiện - nó có thể phơi bày một lượng đáng kể hành vi GC, từ đó có thể hạn chế việc triển khai trong tương lai bởi vì thay đổi hành vi có thể phá vỡ các ứng dụng web.


Cập nhật: Hiện nay is a proposal để tiêu chuẩn hóa tài liệu tham khảo yếu trong JS rằng giúp giảm bớt những rủi ro nhận thức bằng cách buộc việc phát hành của các đối tượng một cách yếu ớt có thể truy cập đến các vòng lặp sự kiện JS, làm cho hành vi xác định hơn.

+0

Vì vậy, bạn đang nói rằng tôi thực sự không bao giờ nên sử dụng "var myLevel = Level()"? Đây có thể là lời khuyên tốt, nhưng câu hỏi vẫn là viết tắt: sau khi tôi đặt myLevel thành null, làm thế nào tôi có thể chắc chắn rằng Thing() vẫn chưa chạy mã? Tôi thấy khó khăn để ghim xuống trong Trình kiểm tra Chrome. – Kokodoko

+0

Không, tôi đang nói cách duy nhất để phát hiện rằng một thứ gì đó đã được thu gom rác sẽ là những tham chiếu yếu. Nhưng các tham chiếu yếu không có sẵn cho mã không có đặc quyền. – the8472

+0

Bạn đang nói cái quái gì vậy?Không có nơi nào trong liên kết đó đề cập đến bất cứ điều gì về rủi ro bảo mật. –

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