Утечки памяти Javascript: почему присвоение объекта null работать?

Может ли кто-нибудь поцарапать меня в отношении природы исправления присвоения нулевого значения, используемого для предотвращения утечек памяти?

Мы все - знаком со следующей техникой остановки циклической ссылки между объектом DOM и объектом JS, чтобы предотвратить утечки памяти:

    function foo() {
      var ele = document.getElementById("someParagraphId");

      ele.onclick = function() {
        //some action here
      };

      ele = null;
    }

Вопрос в том, почему это работает? Установка для "ele" значения null определенно остановит циклические ссылки, но не предотвратит ли это также и будущие ссылки на "ele"?

    function foo() {
      var ele = document.getElementById("someParagraphId");

          ele.onclick = function() {
              console.log("accessing ele ... after set to null " + ele.onclick);
          };

      ele = null;

    }

И все же срабатывает прослушиватель событий. Он будет жаловаться, что объект "ele" имеет значение null (чего мы и ожидали).

Учитывая приведенное выше поведение, правы ли мы, чтобы сделать вывод, что реализация механизма Javascript будет содержать некую внутреннюю ссылку на прослушиватель событий, и именно эта ссылка вызывается при запуске события?

eventHandlerRef = //assignment to "ele.onclick" handler/listener;

Если бы была ссылка, подобная приведенной выше, не зависело бы исправление присвоения нулевого значения от реализации? Или это часть спецификации ECMAScript.

Насколько я понимаю, это исправление всегда было кроссбраузерным. Я не встречал много примеров, в которых особо упоминается определение / анализ типа браузера перед применением нулевого присваивания.

=============== EDIT ====== ============

Я думаю, что из-за того, как я сформулировал вопрос, возможно, невольно возникло прямое обсуждение того, что я пытался передать. Пара концепций, на которые делается ссылка:

дескрипторы объектов / ссылки на объекты ala:

 var obj1, obj2;
     obj1 = {foo: "bar"}; //obj1 points to the an area of the heap allocated 
                          //for the object literal.

 obj2 = obj1;     //obj2 points to the same position in the heap
                      //as obj1.

 //obj1 = null or
 obj1 = {/*another obj literal*/}  //the new object literal is created 
                                       //and allocated in some other part 
                                       //in the heap, and obj1 now points 
                                       //to the new location.

//obj2 is unaffected by obj1's re-assignment. 

Вышесказанное не то, о чем я страдаю, и я сожалею о добавлении строки:

console.log("accessing ele ... after set to null " + ele.onclick);

Вышеупомянутое заставляет это выглядеть закрывающим вопросом . Я полностью ожидал появления ошибки, как указано в исходном сообщении.

Мой зуд больше связан с ... по какой-то причине, на мой взгляд, я все время думаю, что движок Javascript вызовет ele .onlick () непосредственно при срабатывании события и установка для элемента значения null сродни следующему потоку:

var obj = {};
obj.method = function() {};

obj = null;
//error calling obj.method(), i.e., obj is null

Учитывая, что мы знаем из исходного сообщения, что обработчик событий все еще запускается после того, как для элемента ele было установлено значение null, на мой взгляд, поток больше похож на:

var obj = {};
obj.method = function() {};

var objRef = obj; 

obj = null;  

//The Javascript Engine calling objRef.method when event triggered.

Мой зуд сводится к вопросу, как работает большинство реализаций Javascript, где некоторая внутренняя ссылка указывает на назначенный обработчик событий, и эта внутренняя ссылка называется когда событие запускается?

Или, говоря иначе, что мешает реализации Javascript Engine напрямую вызывать an ele.onclick () (оставив на время вопросы дизайна и архитектуры) ?

Может быть, мои мыслительные процессы работают по-другому, но не Никто еще не взглянул бы еще раз, когда они впервые столкнулись с исправлением присвоения нулевого значения, когда ссылка на элемент была обнулена, а код для обработчика все еще выполнялся?

6
задан Sid 15 December 2016 в 06:49
поделиться