2010-09-24 14 views
13

Tôi chỉ đọc câu hỏi này và câu trả lời được chấp nhận: What is JavaScript garbage collection?Bộ sưu tập rác và JavaScript "xóa": Đây có phải là quá mức cần thiết/obfuscation, hoặc một thực hành tốt?

Trong câu trả lời, Noldorin đã tham chiếu một số nguyên tắc từ Apple. Đây là phần tôi quan tâm:

Sử dụng các câu lệnh xóa. Bất cứ khi nào bạn tạo một đối tượng bằng cách sử dụng một câu lệnh mới, hãy ghép nó với một câu lệnh delete. Điều này đảm bảo rằng tất cả bộ nhớ liên kết với đối tượng, bao gồm tên thuộc tính của nó, có sẵn để thu thập rác.

Tôi luôn dành thời gian để cập nhật các phương pháp hay nhất, đặc biệt nếu tôi có thể giảm bớt dung lượng bộ nhớ của tập lệnh. Vì vậy, tôi đã đi kiểm tra một số điều. Nếu tôi hiểu đúng, sau đây là ví dụ về một đối tượng tự xóa sau khi gọi phương thức.

var thing = function() { 
    var a_method, and_another; 
    a_method = function() { /* do stuff */ }; 
    and_another = function() { /* do some other stuff*/ }; 
    this.init = function() { a_method(); and_another(); }; 
}; 
delete new thing().init(); 

Thông thường tôi sẽ bao bọc mọi thứ trong chức năng tự gọi và chuyển vào hình cầu của tôi như trên. Mọi thứ đều giống như tôi thường làm, sự khác biệt duy nhất là tôi đã thêm delete ngay trước new.

Mã hoạt động theo một trong hai cách.

Vì vậy, câu hỏi đặt ra là: Tôi có đang làm mọi thứ tại đây không? Có một số loại lợi ích để xóa một tham chiếu đến một đối tượng chỉ tồn tại bên trong một phạm vi chức năng? Hay tôi chỉ làm mọi thứ trông khó hiểu?

+0

tôi dừng lại làm thu gom rác thải như mười năm trước đây :) –

Trả lời

33

Trước hết tuyên bố delete new scoped_object().init(); không thực sự làm bất cứ điều gì, bạn nên cẩn thận hơn về các biến còn lại trong đóng hoặc nếu bạn có tham chiếu vòng tròn, là nguồn phổ biến nhất của memory leaks.

Nhà điều hành delete có nghĩa là để được sử dụng để thuộc tính đối tượng xóa, và nó là thực sự hiểu lầm, câu trả lời bạn trích dẫn từ @Noldorin trích dẫn một số nội dung của Apple JavaScript "Best Practices", nhưng họ không có một đầu mối về cách delete hoạt động !!.

Họ thậm chí khuyên bạn sử dụng delete trên tài liệu tham khảo biến, và điều đó là không thể -only nhất có thể cho các biến khai báo trong Eval Mã -, bởi vì báo cáo kết quả var tuyên bố biến như phi deletable ({DontDelete} trong ECMAScript 3, hoặc [[Configurable]] = false trong ECMAScript 5) thuộc tính của đối tượng biến-đối tượng tạo thành chuỗi phạm vi-.

Hơn nữa, cố gắng delete một tham chiếu đến một định danh đó là ràng buộc để một kỷ lục môi trường - một định tuyên bố với một VariableDeclaration, FunctionDeclaration hoặc từ một chức năng FormalParameterList -, gây ra một ngoại lệ SyntaxError trên mới ECMAScript 5th Edition dưới Strict Mode.

Tôi muốn giới thiệu bạn đọc bài viết sau về delete:

+0

Thats tuyệt vời. Cảm ơn bạn! – Stephen

+2

+1 cho liên kết đến bài viết của Kangax. Bài viết tuyệt vời! – Rajat

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