La mia intuizione è che è una buona idea per incapsulare blocchi di codice in funzioni anonime in questo modo:Devo incapsulare blocchi di funzionalità nelle funzioni JavaScript anonime?
(function() {
var aVar;
aVar.func = function() { alert('ronk'); };
aVar.mem = 5;
})();
Perché io non avrò bisogno aVar
di nuovo, quindi immagino che il garbage collector sarà quindi eliminare aVar
quando esce dal campo di applicazione. È giusto? O gli interpreti sono abbastanza intelligenti da vedere che non uso più la variabile e la ripulisco immediatamente? Ci sono motivi come stile o leggibilità che dovrei non utilizzare le funzioni anonime in questo modo?
Inoltre, se nomino la funzione, in questo modo:
var operations = function() {
var aVar;
aVar.func = function() { alert('ronk'); };
aVar.mem = 5;
};
operations();
fa operations
quindi necessariamente attaccare intorno fino a quando non esce dallo scope? Oppure l'interprete può dire immediatamente quando non è più necessario?
un esempio migliore
Vorrei anche chiarire che non sto necessariamente parlando di portata globale. Considera un blocco che assomiglia a
(function() {
var date = new Date(); // I want to keep this around indefinitely
// And even thought date is private, it will be accessible via this HTML node
// to other scripts.
document.getElementById('someNode').date = date;
// This function is private
function someFunction() {
var someFuncMember;
}
// I can still call this because I named it. someFunction remains available.
// It has a someFuncMember that is instantiated whenever someFunction is
// called, but then goes out of scope and is deleted.
someFunction();
// This function is anonymous, and its members should go out of scope and be
// deleted
(function() {
var member;
})(); // member is immediately deleted
// ...and the function is also deleted, right? Because I never assigned it to a
// variable. So for performance, this is preferrable to the someFunction
// example as long as I don't need to call the code again.
})();
Le mie ipotesi e conclusioni sono corrette? Ogni volta che non riutilizzerò un blocco, non dovrei solo incapsularlo in una funzione, ma incapsularlo in una funzione anonima in modo che la funzione non abbia riferimenti e venga cancellata dopo che è stata chiamata, giusto?
solo curioso, c'è una perdita di memoria? – jebberwocky