-1
votes

Quelle est l'utilisation exacte de la fermeture?

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?

Fermeture: H2>

p>

function add(x,y,z) {
   
    return x + y + z;
}

console.log(add(1,2,3))


1 commentaires

C'est très peu à voir avec fermetures . 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".


4 Réponses :


0
votes

'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);


0 commentaires

1
votes

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


0 commentaires

1
votes

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


0 commentaires

2
votes

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);


0 commentaires