2016-03-09 17 views
6

Khi tôi thực hiện trang HTML thử nghiệm dưới đây trong Chrome, tôi thấy sau trong debug console:parentNode bị mất khi đóng Javascript bên trong? Lỗi Chrome?

Has parent? true 
Has parent? false 

Tôi có ngay trong giả định rằng đây là một lỗi Chrome (nó không xảy ra trong các trình duyệt khác), hoặc là Chrome có quyền làm điều này vì một lý do nào đó không? Nó dẫn đến một lỗi trong một trong các ứng dụng web của tôi và cuối cùng tôi đã cô lập đoạn mã này để repro vấn đề cốt lõi.

Đây là trang kiểm tra:

<!DOCTYPE HTML> 
 
<html> 
 
    <head> 
 
    <meta charset="UTF-8"> 
 
    <title></title> 
 
    </head> 
 
    <body class=""> 
 
     
 
     
 
     <script> 
 
     function testDoodle() { 
 
      var testParentEl = document.createElement('div'); 
 
      var testChildEl = testParentEl.appendChild(document.createElement('div')); 
 
      
 
      document.body.innerHTML+=('Has parent? ' + !!testChildEl.parentNode+'<br>'); 
 
      console.log('Has parent? ' + !!testChildEl.parentNode); 
 
      
 
      setTimeout(function() { 
 
       document.body.innerHTML+=('Has parent? ' + !!testChildEl.parentNode+'<br>'); 
 
       console.log('Has parent? ' + !!testChildEl.parentNode); 
 
      }, 
 
      2000); 
 
      return; 
 
     } 
 
     testDoodle(); 
 
     </script> 
 

 
    </body> 
 
</html>

EDIT: Tôi có nên nói rằng tôi đang thử nghiệm trên Windows 7 với Chrome 49.0.2623.87 m (64-bit). Cũng có thể repro trên OSX 10.11.2 với Chrome 49.

Ngoài ra, tôi nên đề cập đến đôi khi nó hiển thị đúng/đúng và đôi khi đúng/sai. Bạn có thể phải tải lại trang một vài lần để chứng kiến ​​sự cố. Tôi không chắc chắn, nhưng nó có thể là các công cụ gỡ lỗi (console) cần phải được mở là tốt.

Cảm ơn nhiều.

+0

Làm việc cho tôi trong Chrome 48 OSX – elclanrs

+0

Tôi không thể tạo lại (Chrome 48.0.2564.109). Bạn có chắc chắn rằng 'testParentEl' không bị đột biến giữa các cuộc gọi không? – Bergi

+0

Tôi nên nói rằng tôi đang thử nghiệm trên Windows 7 với Chrome 49.0.2623.87 m (64-bit). Ngoài ra, tôi nên đề cập rằng đôi khi nó hiển thị đúng/đúng và đôi khi đúng/sai. Bạn có thể phải tải lại trang một vài lần để chứng kiến ​​sự cố. Tôi không chắc chắn, nhưng nó có thể là các công cụ gỡ lỗi (console) cần phải được mở là tốt. – logidelic

Trả lời

0

Tôi tin rằng điều này cuối cùng đã được Chrome v50 cố định (hoặc ít nhất là tôi đã không thể repro kể từ khi cập nhật).

0

Tôi đoán là testChildEl.parentNode không tham chiếu testParentEl mạnh mẽ, do đó, nó được thu thập rác.

Cả hai tham khảo testParentEl bên trong thời gian chờ và thêm một tài liệu tham khảo mạnh để testParentEl trên testChildEl sửa chữa các vấn đề đối với tôi:

(function testDoodle() { 
 
    var testParentEl = document.createElement('div'); 
 
    var testChildEl = testParentEl.appendChild(document.createElement('div')); 
 
    setTimeout(function() { 
 
    testParentEl; // Prevents it from being garbage collected 
 
    document.write('Has parent? ' + !!testChildEl.parentNode); 
 
    }, 100); 
 
})();

(function testDoodle() { 
 
    var testParentEl = document.createElement('div'); 
 
    var testChildEl = testParentEl.appendChild(document.createElement('div')); 
 
    testChildEl.strongParent = testParentEl; // Prevents garbage collection 
 
    setTimeout(function() { 
 
    document.write('Has parent? ' + !!testChildEl.parentNode); 
 
    }, 100); 
 
})();

+1

Điều này thực sự giống như một lỗi đối với tôi. – Bergi

+0

Đã có một thứ như tham chiếu "mạnh" và "yếu" trong Javascript chưa? Sự hiểu biết của tôi là không có. Tôi cũng phát hiện ra rằng vấn đề có thể được khắc phục bằng cách tham chiếu rõ ràng đến testPartEl từ bên trong đóng. Vâng, tôi tin chắc đó là lỗi. Rõ ràng một số tối ưu hóa Chrome đã trở nên tồi tệ. Tôi chỉ không chắc tại sao không ai khác có vẻ như từng chút một. – logidelic

+0

@logidelic ES6 giới thiệu WeakSets và WeakMaps, lưu trữ các tham chiếu yếu đến các đối tượng. Ngoài việc này, tất cả phụ thuộc vào việc triển khai thực hiện, thông số kỹ thuật không yêu cầu bộ thu gom rác. Định nghĩa Bu, không thể phát hiện xem một đối tượng có là bộ thu gom rác hay không, vì vậy đây là lỗi. – Oriol

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