2010-01-18 42 views
5

Tôi phải duy trì một đối tượng JavaScript với khoảng 30-40 thuộc tính mà tôi cập nhật vài giây một lần. Tôi đã đọc rằng không có những thứ như "giải phóng" bộ nhớ trong JavaScript, và trình duyệt tự động thu gom rác không sử dụng bộ nhớ.Các đối tượng JavaScript: Phá hủy chúng

Câu hỏi của tôi là: có đủ để đặt chính đối tượng đó thành không, hoặc tôi có cần đặt tất cả thuộc tính của nó thành không và sau đó đặt thành rỗng?

var obj = []; 
obj[prop1] = "123"; 
obj[prop2] = "456"; 
//...and so on... 

// now to release the obj, is it enough if I just did: 
obj = null; 
+0

http://stackoverflow.com/questions/864516/what-is-javascript-garbage-collection – Eineki

Trả lời

1

Một đối tượng chỉ có thể được thu thập nếu không thể truy cập được nữa. Bạn có thể đạt được điều này bằng cách đặt tất cả các biến cục bộ tham chiếu đối tượng thành null (bất kỳ giá trị nào khác cũng sẽ làm) và xóa (hoặc ghi đè) bất kỳ thuộc tính nào của các đối tượng khác tham chiếu đến nó.

Xóa thuộc tính của đối tượng hoặc đặt chúng một cách rõ ràng thành null sẽ không giúp bạn gì về vấn đề này: Tham chiếu của đối tượng sẽ không được coi là 'hoạt động' nếu chính nó không phải là.

+0

hoàn hảo! cảm ơn! – Dmitry

0

Đặt thuộc tính thành rỗng là không cần thiết. Bất kỳ giá trị nào được lưu trữ trong các thuộc tính sẽ được giải phóng bởi bộ thu gom rác. Thay vào đó, nhà điều hành delete có thể sẽ buộc hủy diệt ngay lập tức:

delete obj; 
+2

'delete' không ép buộc hủy đối tượng - nó loại bỏ các thuộc tính khỏi đối tượng; cũng không thể xóa các biến cục bộ; làm như vậy thậm chí là một lỗi cú pháp trong chế độ nghiêm ngặt ECMAScript 5 – Christoph

1

Thời gian duy nhất (tôi có thể nghĩ đến) nơi bạn sẽ cần đặt các mục thành null là một vài trường hợp DOM tham gia. Ví dụ, nếu bạn có một nút với một vài nút con, mỗi nút có một trình xử lý onclick được định nghĩa bởi các hàm ẩn danh, thì hãy đặt mỗi onclick thành null sẽ là một ý tưởng hay (để tránh các tham chiếu không chủ ý).

<div id="delete_me"> 
    <span></span> 
    <span></span> 
</div> 

var theDiv = document.getElementById('delete_me'); 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = function() { 
    // stuff 
    }; 
} 

// Later... 
// Delete stuff. 
var divToDelete = document.getElementById('delete_me'); 

// Remove all the onclicks 
for (var i=0; i < theDiv.childNodes.length; i++) { 
    theDiv.childNodes[i].onclick = null; 
} 

// Delete the div 
divToDelete.parentNode.removeChild(divToDelete); 
2

Các biến không được thu thập rác cho đến khi có ít nhất một tham chiếu đến chúng. Tuy nhiên, hãy lưu ý rằng các biến toàn cầu có thể nhìn thấy từ "ở khắp mọi nơi" và đôi khi có thể không thu thập rác, vì chúng vẫn hiển thị từ đâu đó.

Ví dụ, bạn có

Vì vậy, tôi sẽ đồng ý với việc thiết lập giá trị cho null sau khi bạn đang thực hiện với đối tượng của bạn.

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