2015-07-23 3 views
8

Considerate ho la pagina web di seguito scritto in HTML (sezione solo corpo):La raccolta dati javascript in linea è stata ritirata quando il corpo del documento è stato sostituito?

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

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

Ora, se si sostituisce la innerHTML di document.body da JavaScript con dire, un div, in modo che la parte del corpo diventa:

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

... poi è l'oggetto ammissibili per la garbage collection fn se non esistono riferimenti ad esso in qualsiasi parte del resto del codice (qualsiasi contesto)?

risposta

1

essa sarebbe soggetta a garbage collection se nessun altro riferimenti sono stati fatti ad esso da qualsiasi contesto. Tuttavia, vi è un piccolo riferimento che trattiene quella funzione, l'oggetto finestra globale. Questo perché la funzione (e l'intera sezione di script mostrata) ha un ambito globale. Questo riferimento continuerà a esistere anche se viene sostituito l'intero file HTML.

Ci sono solo alcuni modi per liberare l'oggetto mostrato nell'esempio esatto dall'oggetto globale e renderlo idoneo per la raccolta. L'eliminazione della proprietà sull'oggetto globale non è un'opzione perché è stata dichiarata come funzione e non come proprietà.

  • Sovrascrive la proprietà sull'oggetto globale con qualcos'altro. window.fn = [][0]; (collegamento non definito)
  • Spostarsi fuori dalla pagina in modo che l'oggetto globale diventi idoneo per la garbage collection.

breve nota sulla raccolta dei rifiuti, che si verifica quando il browser si sente che è necessario, e non subito dopo che un oggetto non ha riferimenti (o per lo meno, di solito non - questo può accadere di tanto in tanto) .

1

Appena testato, e interessante, no. Codice

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

prova:

corpo:

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

e del carico, questo viene eseguito:

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

La dichiarazione di funzione crea un oggetto funzione che è semanticamente separato dal contenuto del tag 'script' e memorizza un riferimento a quell'oggetto funzione nella variabile' pippo'; finché tale variabile mantiene tale riferimento, l'oggetto funzione deve continuare ad esistere. Tuttavia, ciò non dice nulla sul fatto che eventuali istruzioni JavaScript "standalone" debbano continuare a esistere in qualsiasi forma, né se una loro rappresentazione sarebbe mantenuta attiva se gli oggetti funzione fossero stati sostituiti. – supercat