Come funziona la garbage collection in JavaScript?

Come funziona la garbage collection in JavaScript? È simile alla garbage collection di .NET? Ed è perché l’implementazione della garbage collection in VBScript è pessima che le persone lo hanno evitato e ha stabilito una preferenza per JavaScript come linguaggio standard lato client?

Come funziona la garbage collection?

La risposta breve è: quando un blocco di memoria (un object, per esempio) non è più raggiungibile, è eleggibile per essere recuperato. Quando, come, o se è reclamato, dipende interamente dall’implementazione e le diverse implementazioni lo fanno diversamente. Ma a livello linguistico, è automatico.

Per esempio:

function foo() { var bar; bar = new ReallyMassiveObject(); bar.someCall(); } 

Quando foo ritorna, la bar degli oggetti punta a diventa automaticamente disponibile per la garbage collection perché non rimane nulla che abbia un riferimento ad esso.

Contrasto con:

 function foo() { var bar; bar = new ReallyMassiveObject(); bar.someCall(); return bar; } // elsewhere var b = foo(); 

… ora un riferimento all’object sopravvive alla chiamata, e persiste finché / a meno che il chiamante assegni qualcos’altro a b o b non rientri nello scope.

Anche in contrasto con:

 function foo() { var bar; bar = new ReallyMassiveObject(); bar.someCall(); setTimeout(function() { alert("Three seconds have passed"); }, 3000); } 

Qui, anche dopo il ritorno di foo , il meccanismo del timer ha un riferimento al callback del timer e il callback del timer – una chiusura – ha un riferimento al contesto in cui è stato creato, che a sua volta contiene la variabile della bar . Di conseguenza, in teoria, a quale bar riferisce non è disponibile per la garbage collection immediatamente dopo il ritorno di foo . Invece, viene mantenuto fino a quando il timer non scatta e rilascia il suo riferimento alla richiamata, rendendo la richiamata e il contesto a cui si riferisce per avere diritto a GC. (In pratica, i moderni motori JavaScript possono ed ottimizzano le chiusure dove possono. Ad esempio, in questo esempio, l’analisi statica mostra che la callback non si riferisce alla bar e non contiene alcuna eval o new Function codice new Function che potrebbe riferirsi a in modo dinamico in fase di runtime, in modo che il motore JavaScript possa lasciare la bar fuori dal contesto a cui si riferisce la funzione, rendendo in tal modo ciò che si riferisce ai requisiti per GC – e quelli moderni lo fanno). (Ulteriori informazioni sulle chiusure in questo articolo .)

JavaScript non ha problemi a gestire la pulizia dei riferimenti circolari, btw, quindi ad esempio:

 function foo() { var a, b; a = {}; b = {}; b.refa = a; a.refb = b; } 

Quando ritorna, il fatto che a si riferisca a b e viceversa non è un problema. Dato che nient’altro si riferisce a nessuno di loro, entrambi possono essere ripuliti. Su IE, questo non è vero se uno degli oggetti è un object fornito dall’host (come un elemento DOM o qualcosa creato tramite new ActiveXObject ) invece di un object JavaScript. (Quindi, per esempio, se metti un riferimento ad un object JavaScript su un elemento DOM e l’object JavaScript fa riferimento all’elemento DOM, si mantengono l’un l’altro in memoria anche quando nessuno fa riferimento a nessuno di essi.) Ma questo è un problema di IE , non una cosa di JavaScript.

Ri:

è perché il vcscript GC è cattivo che le persone tornino a javascript come la loro API lato client standard?

JavaScript era il linguaggio di scripting web lato client originale . VBScript è venuto solo più tardi, quando Microsoft è uscito con un browser, ed è stato sempre supportato solo nei browser Microsoft. JavaScript era ed è l’unico gioco di script sul lato client in città se si desidera lavorare con la più ampia gamma di browser. È anche circa otto volte il classico linguaggio VBScript di sempre. 😉

La raccolta dei rifiuti , in linea di principio, utilizza metodi simili in tutte le lingue. La loro implementazione sarà tuttavia diversa in ambienti diversi (ad es. Ogni browser utilizza un modo diverso di implementare JavaScript GC). Per una breve panoramica del GC di Chrome, vedi ad esempio questo .

Come per VBScript, è stato creato come un linguaggio rivale / sostitutivo JavaScript che viene eseguito solo in IE. Questa era una decisione abbastanza ragionevole al momento in cui è stata introdotta VBS – IE aveva il 90% della share del browser e sembrava che VBS potesse sostituire il JavaScript (ampiamente supportato, vecchio e con funzionalità scadenti al momento); non così tanto al giorno d’oggi. Inoltre, VBScript è fondamentalmente Visual Basic Lite, con tutte le connotazioni negative per andare con quella marca.