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".