Una funzione anonima è solo una funzione che non ha nome; niente di più. Una chiusura è una funzione che cattura lo stato dell'ambiente circostante.
Una funzione anonima non deve necessariamente creare una chiusura e una chiusura non viene creata solo per le funzioni anonime.
Considera questo ipotetico contro-esempio. Considera una lingua Foo che non supporta le chiusure ma supporta le funzioni anonime. Questo linguaggio potrebbe non compilare o generare un errore per il codice qui sotto perché "saluto" non è definito nell'ambito della funzione interna. Il fatto che sia anonimo è irrilevante.
function outer() {
var greeting = "hello ";
(function(name) {
alert(greeting + name);
})("John Doe");
}
Consideriamo ora un linguaggio effettivo che supporta le chiusure - JavaScript. Prendendo lo stesso esempio come sopra, ma nominando la funzione interna questa volta dà:
function outer() {
var greeting = "hello ";
(function inner(name) {
alert(greeting + name);
})("John Doe");
}
Anche se la funzione interna non è più anonima, si coglie ancora stato dall'ambiente circostante.
Le chiusure forniscono una comodità molto necessaria, altrimenti passeremmo ogni singola dipendenza della funzione come argomento.
function outer() {
var greeting = "hello ";
(function(name, greeting) {
alert(greeting + name);
})("John Doe", greeting);
}
No, ma è un duplicato di http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda mia cattiva –