2012-03-05 31 views
6

Tôi đã tạo một trò chơi HTML5 bao gồm nhiều cấp độ nhỏ. Khi người chơi đến được cửa, một cấp độ khác sẽ được nạp. Khi mức đang tải nó về cơ bản chỉ là tập hợp tất cả các mảng dụ để [] và sau đó đẩy thứ vào họ, bằng cách tạo ra các trường hợp mới của sự vật, ví dụ:Trong Javascript, tôi có nên xóa các phiên bản cấp trước đó sau khi tải một phiên bản mới không?

enemies = [] //this has previously been full of pointers from the old level 
for (i = 0; i < n_enemies; i ++) 
    enemies.push(new Enemy()); 

Tuy nhiên, nó đã đi đến sự chú ý của tôi mà chỉ đơn thuần là thiết lập một mảng đầy đủ các con trỏ đến [], không thực sự xóa các phiên bản! Vì vậy, hiện javascript làm điều này tự động? Hoặc tôi có tự mình phải tự mình delete mỗi lần không?

Trả lời

3

Nếu các đối tượng trong mảng không còn được tham chiếu từ bất cứ đâu thì chúng sẽ được thu gom rác. Không có đặc tả nào nêu rõ khi nào điều này xảy ra, nhưng nó sẽ sớm được gỡ bỏ sau khi loại bỏ chúng khỏi Array.

Điều này không thể hiện rò rỉ bộ nhớ.

+2

Ngoài ra 'xóa' chỉ được xác định cho thuộc tính của đối tượng, vì vậy javascript thậm chí không chứa cách xóa biến mảng - bạn phải giả định công cụ js sẽ xử lý bộ sưu tập rác sau khi tất cả các tham chiếu bị xóa. – wheresrhys

+0

wheresrhys - Các thành viên mảng chỉ là các thuộc tính có tên số. Xóa các công trình trên chúng quá (ví dụ 'xóa mảng ['0']' loại bỏ thành viên đầu tiên của một mảng bắt đầu từ số không), nhưng như Jivings nói, nó không cần thiết ở đây. – RobG

+0

@RobG - Có lẽ tôi nên rõ ràng hơn - bởi "biến mảng", tôi có nghĩa là các biến là mảng, chứ không phải là giá trị nguyên thủy được lưu trữ trong mảng. – wheresrhys

1

Giống như bất kỳ ngôn ngữ lập trình nào khác. Nếu có một tham chiếu đến đối tượng, nó sẽ không bị xóa.

ví dụ:

enemies = []; 
enemy = new Enemy(); 
enemies.push(enemy); 
enemies = []; 

Trong trường hợp bạn không tạo ra một tham chiếu đến đối tượng sau khi đổ kẻ thù, đối tượng kẻ thù cũng sẽ bị xóa

enemies.push(new Enemy()); 
+0

* mọi ngôn ngữ lập trình ** thu thập rác khác **. Nếu bạn đang làm việc bằng ngôn ngữ không phải GC, bạn sẽ cần phải tự mình xử lý việc cấp phát bộ nhớ. – Davy8

2

Tôi không biết nhiều về trò chơi phát triển nhưng thường trong Javascript thanh toán bù trừ mảng được thực hiện như thế này, và điều này là thực hành tốt

enemies.length = 0; 

việc kiểm tra này post

+0

+1 Công trình này giống hệt như thiết lập mảng thành '[]'. – Jivings

+0

Tôi chưa bao giờ nghe nói về điều này trước đây. Dường như nó hoạt động (chỉ được thử nghiệm trong Chrome) nhưng bất kỳ tham chiếu nào đến điều này là thực hành tốt? – Davy8

+0

OK, nhưng tôi tin rằng đây phải là một bình luận, vì nó không trả lời trực tiếp câu hỏi. Cảm ơn. Tôi đã thử nghiệm nó trong Chrome, nó hoạt động, nhưng tôi đã không đọc nó ở bất cứ đâu. Nếu đó là cách "đúng", tại sao không có nhiều người nói về nó? – corazza

1

Không có lệnh free trong JavaScript, do đó bạn không thể tự mình "tự do" bất kỳ bộ nhớ nào. Tất cả những gì bạn có thể làm là: Giết tất cả các tham chiếu (con trỏ) đến một số đối tượng. Cuối cùng, bộ thu gom rác sẽ tìm kiếm các đối tượng không còn hiển thị với bất kỳ ai.

Hoặc đúng hơn: GC cuối cùng sẽ thu thập tất cả bộ nhớ mà vẫn có thể tiếp cận và quên về phần còn lại. Đây là lý do tại sao chỉ các vật thể sống có giá trong môi trường GC.

Nhưng có một sự bắt giữ: GC không nói với các đối tượng rằng chúng đã chết. Vì vậy, nếu đối tượng Enemy của bạn cần một số dọn dẹp, sau đó bạn phải làm điều đó bằng tay.

+0

Không có? Tôi khá chắc chắn có, nó là một từ khóa và tôi đọc về nó ở đâu đó! 1 cho tất cả các thông tin hữu ích. – corazza

+1

@Bane [Toán tử xóa] (https://developer.mozilla.org/en/JavaScript/Reference/Operators/delete) – Jivings

+0

Aha! Điều đó đã xóa rất nhiều. – corazza

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