2011-02-06 2 views
49

Possibili duplicati (differenza?):
What is Closures/Lambda in PHP or Javascript in layman terms?
What is the difference between a 'closure' and a 'lambda'?Chiusura vs funzione Anonymous

Ciao,

sono stato in grado di trovare una definizione che spiega chiaramente la differenze tra una chiusura e una funzione anonima.

La maggior parte dei riferimenti che ho visto chiaramente specifica che sono "cose" distinte, ma non riesco a capire perché.

Qualcuno potrebbe, per favore, semplificarlo per me? Quali sono le differenze specifiche tra queste due caratteristiche linguistiche? Quale è più appropriato in quali scenari?

+2

No, ma è un duplicato di http://stackoverflow.com/questions/220658/what-is-the-difference-between-a-closure-and-a-lambda mia cattiva –

risposta

74

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); 
} 
+0

Può citare alcune fonti per le definizioni utilizzate nella tua risposta? – Pacerier

+0

@Pacerier Non ho usato definizioni diverse da quelle già citate nella domanda, e fondamentalmente 'chiusure' e' funzioni anonime'. Ho trovato gli esempi da solo, quindi non posso fornire riferimenti esterni per quelli. – Anurag

+0

Quello che intendo è il riferimento da una fonte più definita come da Wikipedia, ecc. – Pacerier