2011-02-02 17 views
11

Is it OK để làm điều này ?:'new` mà không cần' DELETE` trên cùng một biến trong Javascript

function mygetTime() 
{ 
    var d = new Date(); 
    return(d.getTime()); 
} 

function wasteSomeMemory() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = mygetTime(); 
    } 
} 

sẽ gọi wasteSomeMemory() nguyên nhân rò rỉ bộ nhớ?

gì về điều này:

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
    } 
} 

sẽ gọi wasteSomeMemory2() nguyên nhân rò rỉ bộ nhớ? Tôi có nên sử dụng delete temp; ở cuối vòng lặp không?

function wasteSomeMemory2() 
{ 
    var temp; 
    for(var count = 0; count < 1000000; count += 1) 
    { 
     temp = new Date(); 
     delete temp; 
    } 
} 

Trả lời

29

newdelete không có gì gì để làm với nhau trong JavaScript (mặc dù tương tự gây nhầm lẫn của họ cấu trúc hoàn toàn khác nhau trong các ngôn ngữ khác). Đừng lo lắng về việc tạo ra các đối tượng (new) mà không làm sạch chúng một cách rõ ràng, đó là công việc của người thu gom rác.

new là để tạo đối tượng thông qua hàm hàm dựng. delete, mặt khác, là để loại bỏ các thuộc tính khỏi các đối tượng. Nó có không có gì để thực hiện việc xóa đối tượng khỏi bộ nhớ, ngoài tác dụng phụ (ví dụ: nếu tham chiếu duy nhất còn tồn tại đối tượng đó là từ thuộc tính bạn đã xóa).

Ví dụ về sử dụng đúng delete:

var obj = {}; 
obj.foo = "bar"; // Now `obj` has a property called `foo` 
delete obj.foo; // Now it doesn't 

chức năng getmyTime của bạn là hoàn toàn tốt đẹp. Đối tượng Date sẽ đủ điều kiện để được xác nhận quyền sở hữu ngay lập tức khi chức năng trả lại (cho dù đó là đã được gỡ bỏ hoàn toàn xuống quá trình triển khai). Nó không gây ra rò rỉ bộ nhớ, ngoại trừ khi thực hiện lỗi.

bạn wasteSomeMemory2 tương tự không gây rò rỉ bộ nhớ, và trong thực tế, bạn có thể không gọi delete temp;   — bạn chỉ có thể xóa tài sản, không vars.


lần khi bạn có để giúp các bộ thu rác ra ngoài, nhưng những người thường làm không (theo kinh nghiệm của tôi) phải làm với các thuộc tính đối tượng và do đó, không liên quan đến delete. Chúng chỉ thực sự xuất hiện khi bạn tạo các thể hiện chức năng (thường là nếu bạn đang thiết lập các trình xử lý sự kiện hoặc các hàm hẹn giờ, v.v.). Ví dụ, hãy xem xét:

function foo() { 
    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

Bởi vì chức năng ẩn danh của bạn, bạn đã gán cho một bộ đếm thời gian qua setInterval sẽ sống sót cuộc gọi chức năng, nó giữ một tham chiếu trực tiếp đến tất cả mọi thứ đó là trong phạm vi trong thời gian đó gọi hàm (cho dù đó sử dụng nó hay không). Điều này giữ danh sách những thứ mà listOfThings trỏ vào bộ nhớ. Nếu chức năng hẹn giờ không cần danh sách đó, đó là một mối quan tâm. Bạn có thể phát hành danh sách mà listOfThings điểm đến nếu bạn biết rằng các chức năng không cần đến nó, bằng cách gán undefined hoặc null hoặc bất cứ điều gì để listOfThings khi bạn đang thực hiện với nó:

function foo() { 

    var listOfThings = /* ...get a list of things... */; 

    // ...do something with `listOfThings`... 

    listOfThings = undefined; // Done with it   <== The new bit 

    setInterval(function() { 
     // ...do something that *doesn't* need `listOfThings`... 
    }, 1000); 
} 

Điều này cũng đúng đối với chức năng xử lý sự kiện, v.v.Bất cứ khi nào bạn tạo một hàm, nó "đóng lại" (giữ một tham chiếu trực tiếp) bất kỳ thứ gì trong phạm vi mà nó được định nghĩa. Vì vậy, nếu bạn không cần những thứ đó, bạn có thể đảm bảo chúng không được lưu giữ trong bộ nhớ bằng cách xóa các tham chiếu đến chúng. (Thêm: Closures are not complicated)

4

Câu trả lời ngắn gọn là không.

Câu trả lời dài là chúng tôi hy vọng sẽ thu thập được bộ lọc thu nhặt rác này.

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