En quoi une fermeture est-elle différente d'un rappel?
-
03-07-2019 - |
Question
J'ai posé une question sur les rappels et est arrivé à une autre question (voir commentaire). En quoi une fermeture est-elle différente d'un rappel?
La solution
Vérifiez l'introduction en ceci: http://jibbering.com/faq/faq_notes/closures. html . Cela peut vous aider à mieux comprendre le lien entre les fermetures et les fonctions.
Voici un ensemble d’exemples de fermeture: http://www.javascriptkit.com/javatutors/ closures2.shtml
En gros, le rappel est comme un pointeur de fonction. Le bit qui en fait une fermeture, c'est quand cette fonction accède à n'importe quoi sur le contexte dans lequel elle vit, comme les variables en dehors de ça. Lorsque cela se produit, la fonction utilisera les valeurs actuelles des variables (au lieu de les copier). Voir exemple 4.
Autres conseils
Il existe une bonne définition des fermetures ici :
Une "fermeture" est une expression (typiquement une fonction) pouvant avoir variables libres avec un environnement qui lie ces variables (qui "ferme" l'expression).
En pratique, cela signifie que c'est une fonction qui a des variables cachées.
Un rappel est une idée de niveau supérieur. Généralement, c'est une fonction qui est transmise avec l'intention d'être appelée ultérieurement. En JavaScript, les fermetures sont souvent utilisées comme rappels.
En termes simples: un rappel utilisant des variables de contexte est une fermeture.
Un rappel dépendant d'une variable de contexte appelée variable liée (== état d'objet) sera une fermeture. Ce sera une fonction pure, sinon, quand il ne prendra que des variables libres (== paramètres).
Voici un moyen de différencier ces deux éléments:
Fermeture
Une fermeture sert à étendre la fonctionnalité. Par exemple, si un utilisateur clique sur un bouton, nous voulons que quelque chose se passe à l'écran. Dans ce cas, nous utiliserions une fermeture à laquelle nous transmettons l'événement de l'utilisateur (un clic), puis pousser les données à la vue.
Rappel
Un rappel est plus ou moins similaire à une fermeture, mais il est plus utilisé pour informer et fournir des capacités synchrones. Par exemple, si vous effectuez des appels jQuery Ajax, vous aurez des rappels tels que
success ()
,erreur ()
,beforeSend ()
, etc. en avant pour gérer les données asynchrones.
Qu'est-ce qu'une fonction de rappel?
Une fonction de rappel est une fonction qui est:
- passé en argument à une autre fonction
- est appelé (& # 2354; & # 2366; & # 2327; & # 2370;) après une sorte d’événement
- une fois que sa fonction parent est terminée, la fonction passée en argument est ensuite appelée
en clair, on dit Un rappel est une fonction appelée par une autre fonction, qui prend la première fonction en tant que paramètre ou fonction transmise en tant qu'argument
- Note: invoqué : le code à l'intérieur d'une fonction est exécuté lorsque la fonction est invoquée. ou on dit comme ça Il est courant d'utiliser le terme "appeler une fonction". au lieu de "invoquer une fonction".
Il est également courant de dire "appeler une fonction", "démarrer une fonction" ou "exécuter une fonction".
function getUserInput(firstName, lastName, age, callback2,callback1) {
var fullName = firstName + " " + lastName;
// Make sure the callback is a function
if (typeof callback2 === "function") {
// Execute the callback function and pass the parameters to it
callback2(fullName, age);
}
if (typeof callback1 === "function") {
callback1(lastName);
}
}
function callbackforlastname1(lname){
console.log("---");
}
function genericPoemMaker(name, aged) {
console.log(name + " is finer than fine wine.");
console.log("A " + aged + " of unfortunl smile");
}
getUserInput("Avinash", "Maurya", "26", genericPoemMaker,callbackforlastname1);
fermeture:
-
Un mot-clé de fonction dans une autre fonction, vous créez une fermeture
-
Ou Un retour de fonction à une autre fonction on peut dire fermeture
Note Plain English: Une petite différence de fonction transmise en tant qu'argument dans une autre fonction est un rappel ou si définir dans une autre fonction est une fermeture
var length = 101;
function fn2() {
console.log("fffxxx: "+this.length);
}
var obj = {
length: 5,
method3: function(fn) {
fn();
arguments[0]();
}
};
obj.method3(fn2, 1);
fffxxx:101
fffxxx:2**
Je ne vois pas comment les deux sont même liés? Une fermeture entraîne certaines fonctions d’un État local dans une fonction, qu’on considère comme passant par référence.
Un rappel a pour but de vous informer de certains changements et redirige le flux du programme. La fermeture pourrait modifier l’état local, mais vous n’auriez jamais besoin de temps processeur pour le gérer, comme vous le feriez avec un rappel.