I gestori di eventi Javascript aumentano sempre l'utilizzo della memoria del browser


Answers

fn è una chiusura anche senza codice. Ad esempio, prova a eseguire il debug con Firebug e imposta il breakpoint all'interno di quella funzione. Tutte le variabili definite in chiusura (codice fn + variabili che girano intorno = chiusura) sono teoricamente accessibili (anche se non so come accedervi in ​​pratica).

Question

Modifica: su un ulteriore esame di Firefox non sembra farlo, ma Chrome sicuramente lo fa. Immagino sia solo un bug con un nuovo browser: per ogni evento una lettura I / O avviene anche in Chrome ma non in FF.

Quando carico la pagina seguente in un browser (che ho testato in Chrome e Firefox 3 in Vista) e spostando il mouse intorno alla memoria, aumenta sempre e non sembra mai retrocedere.

È questo:

  1. comportamento atteso da un browser
  2. una perdita di memoria nel browser o
  3. una perdita di memoria nel codice presentato?

.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>test</title>
</head>
<body>
   <script>
      var createEl = function (i) {
          var el = document.createElement("div");
          var t = document.createTextNode(i.toString());
          el.appendChild(t);
          t=null;
          el.id=i.toString();

          var fn = function (e) {};
          el.addEventListener("mouseover", fn, false);
          //el.onmouseover = fn;
          fn = null;

          try{
            return el;
          }
          finally{
            el=null;
          }
          //return (el = [el]).pop();
        };

        var i,x;
        for (i= 0; i < 100; i++){
          x = createEl(i)
          document.body.appendChild(x);
          x = null;
        }
   </script>
</body>
</html>

Il (el = [el].pop()) e le idee try/finally sono entrambi da qui , anche se non sembrano aiutare - comprensibilmente dato che sono pensati solo per essere ie6 correzioni.

Ho anche sperimentato l'uso di addEventListener e dei metodi onmouseover di aggiungere gli eventi. L'unico modo che ho trovato per evitare che la memoria aumenti è di commentare entrambe le righe di codice.