2013-05-31 18 views
6

Prendiamo ad esempio questo codice:Un ambito termina quando non viene restituito alcun riferimento?

var test = (function(){ 
    var name = 'rar'; 
    return function foo(){ 
    console.log('test'); 
    }; 
}()); 

foo viene restituito al test, senza alcun riferimento allaname del perimetro interno. Cosa succede a name? È distrutto? O continua a esistere e penzolare con la funzione restituita, ma non è possibile accedervi? Sarebbe il primo caso sia simile a fare quanto segue, come se name non è mai stato parte dell'equazione ?:

var test = function foo(){ 
    console.log('test'); 
}; 

Ecco un altro caso:

var test2 = (function(){ 
    var name = 'rar'; 
    var age = '20'; 
    return function foo(){ 
    console.log(age); 
    }; 
}()); 

age viene referenziato da foo e formerà una chiusura . Tuttavia, name non viene ancora referenziato da nulla. Cosa succede a name in questo caso? È distrutto? O continua a esistere e penzolare con la funzione restituita, ma non è possibile accedervi?

+2

http://stackoverflow.com/a/864549/2269749 – BlitZ

+0

@CORRUPT Le risposte sembrano indicare che ciò che accade dipende dall'implementazione. Quindi, nel peggiore dei casi, il nome rimarrà, giusto? – Joseph

+0

Sì. I browser hanno diversi motori JS GC, ognuno può agire diversamente in questo caso. Considerare 'name = null' come opzione, per evitare perdite di memoria. – BlitZ

risposta

4

In Chrome, name sarà GCed; in FireFox, name viene mantenuto con l'intera chiusura. IE? Non lo so.

+0

Posso richiedere un riferimento sul perché il nome GC di Chrome 'ma non su Firefox? – Joseph

+0

@JosephtheDreamer Non ho alcun riferimento, la mia risposta è basata esclusivamente sull'osservazione mentre si lavora con i browser. –

Problemi correlati