web-dev-qa-db-fra.com

Fermeture vs fonction anonyme (différence?)

Doublons possibles:
Qu'est-ce que Closures/Lambda en PHP ou Javascript en termes simples)
Quelle est la différence entre une "fermeture" et une "lambda"?

Salut,

Je n'ai pas pu trouver de définition expliquant clairement les différences entre une fermeture et une fonction anonyme.

La plupart des références que j'ai vues indiquent clairement que ce sont des "choses" distinctes, mais je n'arrive pas à comprendre pourquoi.

Quelqu'un pourrait-il me simplifier la tâche? Quelles sont les différences spécifiques entre ces deux fonctionnalités linguistiques? Lequel est le plus approprié dans quels scénarios?

66
Maxim Gershkovich

Une fonction anonyme est juste une fonction sans nom; rien de plus. Une fermeture est une fonction qui capture l'état de l'environnement environnant.

Une fonction anonyme n'a pas nécessairement besoin de créer une fermeture, et une fermeture n'est pas créée uniquement pour les fonctions anonymes.

Considérez ce contre-exemple hypothétique. Prenons un langage Foo qui ne prend pas en charge les fermetures mais prend en charge les fonctions anonymes. Ce langage peut ne pas compiler ou générer une erreur pour le code ci-dessous car "message d'accueil" n'est pas défini dans la portée de la fonction interne. Le fait qu'il soit anonyme n'est pas pertinent.

function outer() {
    var greeting = "hello ";

    (function(name) {
        alert(greeting + name);
    })("John Doe");
}

Prenons maintenant un langage réel qui prend en charge les fermetures - JavaScript. En prenant le même exemple que ci-dessus, mais en nommant la fonction intérieure cette fois, vous obtenez:

function outer() {
    var greeting = "hello ";

    (function inner(name) {
        alert(greeting + name);
    })("John Doe");
}

Bien que la fonction interne ne soit plus anonyme, elle capture toujours l'état de l'environnement environnant.

Les fermetures offrent une commodité bien nécessaire, sinon nous passerions chaque dépendance de la fonction comme argument.

function outer() {
    var greeting = "hello ";

    (function(name, greeting) {
        alert(greeting + name);
    })("John Doe", greeting);
}
90
Anurag