2015-07-23 12 views
8

Cân nhắc tôi có trang web dưới đây được viết bằng HTML (cơ thể chỉ mục):Rác javascript nội tuyến có được thu thập khi cơ thể tài liệu được thay thế không?

<body> 
    <p> 
     ... 
    </p> 

    <script> 
     function fn() { 
      // do stuff 
     } 
    </script> 
</body> 

Bây giờ, nếu tôi thay thế innerHTML của document.body từ JavaScript với tiếng nói, một div, do đó một phần cơ thể trở nên:

<body> 
    <div> 
     ... 
    </div> 
</body> 

... sau đó là fn đối tượng đủ điều kiện cho thu gom rác thải nếu không có tài liệu tham khảo để nó tồn tại bất cứ nơi nào trong phần còn lại của mã (bất kỳ ngữ cảnh)?

Trả lời

1

Nó sẽ là đối tượng để thu gom rác thải nếu không có khác tài liệu tham khảo đã được thực hiện cho nó từ bất kỳ ngữ cảnh nào. Tuy nhiên, có một tham chiếu nhỏ đang giữ cho hàm đó, đối tượng cửa sổ chung. Điều này là do chức năng (và toàn bộ phần kịch bản được hiển thị) là phạm vi toàn cầu. Tham chiếu này sẽ vẫn tồn tại ngay cả khi toàn bộHTML của tài liệu.bị được thay thế.

Chỉ có một vài cách để giải phóng đối tượng được hiển thị trong ví dụ chính xác của bạn khỏi đối tượng chung và làm cho nó đủ điều kiện để thu thập. Việc xóa thuộc tính trên đối tượng chung không phải là một tùy chọn vì nó được khai báo là một hàm và không phải là thuộc tính.

  • Ghi đè thuộc tính trên đối tượng chung với vật gì khác. window.fn = [][0]; (phím tắt không xác định)
  • Điều hướng khỏi trang để đối tượng chung đủ điều kiện thu thập rác.

nhanh lưu ý về thu gom rác thải, nó xảy ra khi trình duyệt cảm thấy rằng nó là cần thiết, và không ngay sau khi một đối tượng không có tài liệu tham khảo (hoặc ít nhất, không thường - điều này có thể xảy ra bất cứ lúc nào) .

1

Chỉ cần thử nghiệm điều này và thú vị là không. đang

http://jsfiddle.net/wah754La/1/

Test:

cơ thể:

<script type="text/javascript"> 
    function foo() { 
     // i exist! 
    } 
</script> 

và trên tải, điều này được chạy:

document.body.innerHTML = ''; 
console.log(foo); 
// logs 'function foo()' 
+0

Khai báo hàm tạo một đối tượng hàm tách biệt ngữ nghĩa với nội dung của thẻ 'script' và lưu trữ tham chiếu đến đối tượng hàm đó trong biến' foo'; miễn là biến đó giữ tham chiếu đó, đối tượng hàm phải tiếp tục tồn tại. Tuy nhiên, điều đó không nói gì về việc có bất kỳ câu lệnh JavaScript "độc lập" nào sẽ tiếp tục tồn tại dưới mọi hình thức hay không, hoặc bất kỳ biểu diễn nào của chúng sẽ được giữ nguyên nếu các đối tượng hàm được thay thế. – supercat

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