fermeture me fait mal dans mes entretiens. Enfin j'ai appris quelque chose à propos de fermeture . Mais ma question est de savoir quelle est la différence entre ces extraits ci-dessous? Quels scénarios devrions-nous utiliser des fermetures?
p>
function add(x,y,z) { return x + y + z; } console.log(add(1,2,3))
4 Réponses :
'Ajouter (1) (2) (3)' et 'Ajouter (1,2,3)' ont le même résultat. Mais je peux faire beaucoup de choses avec l'ancien. Permettez-moi de vous donner un exemple.
p> function add(x) {
return function(y) {
return function(z) {
return x + y + z;
}
};
}
const WELCOME_POINT = 10;
const VIP_POINT = 20;
function myPointCaculator(currentPoint, predicate) {
if(typeof predicate === 'number')
return currentPoint + predicate;
else if(typeof predicate === 'function') {
return currentPoint + predicate(WELCOME_POINT);
} else {
return currentPoint;
}
}
const eventPoint = add(WELCOME_POINT)(VIP_POINT);
myPointCaculator(WELCOME_POINT, eventPoint);
C'est un exemple assez synthétique et surtout inutile. En résumé, vous avez besoin de fermetures car JavaScript utilise beaucoup de code basé sur le rappel et vous souhaitez conserver l'accessibilité à la portée antérieure dans ces rappels:
function foo(bar) { setTimeout(function () { alert(bar); }); }
Cet exemple particulier montre une fonction curry pour activer application partielle . Cela pourrait ne pas sembler utile pour un seul appel de fonction, mais vous permet également d'écrire
p>
function add2(y) { return add(2, y); }
Dans cet exemple, il n'y a pas de vraie différence dans la sortie. Cependant, le rendormons encore plus simple:
p>
function extract(name) { return function(item) { return item[name]; } } const shoppingCart = [ {name: "item1", price: 1}, {name: "item2", price: 2}, {name: "item3", price: 3}, {name: "item4", price: 4}, {name: "item5", price: 5}, {name: "item6", price: 6}, ]; const people = [ {name: "Alice", drives: "Audi"}, {name: "Bob", drives: "BMW"}, {name: "Carol", drives: "Citroen"}, {name: "David", drives: "Dodge"}, {name: "Esther", drives: "EDAG"}, {name: "Fred", drives: "Ford"}, ]; const prices = shoppingCart.map(extract('price')); console.log(prices); const names = people.map(extract('name')); const cars = people.map(extract('drives')); console.log(names); console.log(cars);
C'est très peu à voir avec fermetures i>. Ils sont utilisés, oui, mais une fermeture ne signifie pas nécessairement structurer votre code comme le premier exemple. Le sujet que vous êtes après est "Currying" et / ou "Application partielle des fonctions".