6

Когда я исполняю ниже тестовой HTML страницы в Chrome, я вижу следующее в консоли отладки:parentNode теряется при закрытии Javascript? Ошибка Chrome?

Has parent? true 
Has parent? false 

я прав, полагая, что это ошибка Chrome (это не происходит в других браузерах), или Chrome по праву может это сделать по какой-то причине? Это привело к ошибке в одном из моих веб-приложений, и я, наконец, изолировал этот фрагмент, чтобы воспроизвести основную проблему.

Вот тестовая страница:

<!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: Я должен отметить, что я тестирую на Windows 7 с Chrome 49.0.2623.87 м (64-разрядная версия). Также был способен воспроизвести OSX 10.11.2 с Chrome 49.

Кроме того, я должен упомянуть, что иногда он отображает true/true, а иногда и true/false. Возможно, вам придется перезагрузить страницу несколько раз, чтобы засвидетельствовать проблему. Я не уверен, но возможно, что инструменты отладки (консоли) также должны быть открыты.

Большое спасибо.

+0

Работает для меня в Chrome 48 OSX – elclanrs

+0

Я не могу воспроизвести (Chrome 48.0.2564.109). Вы уверены, что 'testParentEl' не изменен между вызовами? – Bergi

+0

Я должен был упомянуть, что тестирую Windows 7 с Chrome 49.0.2623.87 м (64-разрядный). Кроме того, я должен упомянуть, что иногда он отображает true/true, а иногда и true/false. Возможно, вам придется перезагрузить страницу несколько раз, чтобы засвидетельствовать проблему. Я не уверен, но возможно, что инструменты отладки (консоли) также должны быть открыты. – logidelic

ответ

0

Я считаю, что это, наконец, исправлено Chrome v50 (или, по крайней мере, я не смог воспроизвести с момента обновления).

0

Мое предположение, что testChildEl.parentNode не ссылается на testParentEl, так что это сбор мусора.

Обе ссылки testParentEl внутри тайм-аута и добавления сильной ссылки на testParentEl на testChildEl решить эту проблему для меня:

(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

Это действительно звучит как ошибка для меня. – Bergi

+0

Есть ли такие вещи, как «сильные» и «слабые» ссылки в Javascript? Я понял, что нет. Я также обнаружил, что проблема может быть устранена путем явной ссылки на testPartEl изнутри закрытия. Да, я убежден, что это ошибка. Очевидно, что некоторая оптимизация Chrome ухудшилась. Я просто не знаю, почему никто другой, кажется, не увлекся этим. – logidelic

+0

@logidelic ES6 представляет WeakSets и WeakMaps, которые хранят слабые ссылки на объекты. Помимо этого, все зависит от реализации, спецификация не требует сборщика мусора. Bu, не должно быть возможности определить, был ли объект сборщиком мусора, так что это ошибка. – Oriol

Смежные вопросы