J'ai rencontré un exemple de code javascript comme ci-dessous et je ne sais pas comment cela fonctionne. Je suis habitué à passer des fonctions en tant que rappels, mais je n'arrive pas à comprendre comment

  1. la variable func peut prendre des arguments (a, b), et
  2. pourquoi la paire de fonctions serait appelée de cette manière.
function cons(a, b) {
    const pair = func => {
        return func(a, b);
    };
    return pair;
}

function car(pair) {
    return pair((a, b) => {
        return a;
    });
}

function cdr(pair) {
    return pair((a, b) => {
        return b;
    });
}

console.log(cons(1, 2))
//  ƒ pair(func) {return func(a, b);}
console.log(car(cons(1, 2)))
// 1
console.log(cdr(cons(1, 2)))
// 2
2
bigmugcup 18 mars 2019 à 11:53

2 réponses

Meilleure réponse

La variable func prend les arguments a et b car ce sont des paramètres dans la fonction cons. L'appel de fonction se produit comme ça (je crois que vous parlez d'une fonction enregistrée dans la console) car cons renvoie une fonction, que vous n'appelez pas - par conséquent, vous passez plus d'arguments (fonctions de rappel) comme donc:

function cons(a, b) {
    const pair = func => {
        return func(a, b);
    };
    return pair;
}

function car(pair) {
    return pair((a, b) => {
        return a;
    });
}

function cdr(pair) {
    return pair((a, b) => {
        return b;
    });
}

cons(1, 2)(console.log);
console.log(car(cons(1, 2)))
// 1
console.log(cdr(cons(1, 2)))
// 2
2
Jack Bashford 18 mars 2019 à 09:01

En termes simples, tout se passe grâce à closure ! vous appelez une fonction cons qui renvoie en interne une autre définition de fonction qui fait référence en interne aux propriétés a et b qui sont dans la portée de la fonction cons [a parent].

Pour ajouter plus de lumières, faisons quelques changements simples et vous pouvez le voir,

function cons(a, b) {
    const pair = func => {
        console.log('a: ', a);
        console.log('b: ', b);
    };
    return pair;
}

let childFun = cons(10, 30);
console.log(childFun());

Maintenant, cons renvoie une fonction qui accepte une fonction en tant que paramètre et exécute cette fonction sur a et b mémorisés. ensuite, vous passez cette fonction de fermeture car et la fonction car déclenche cette fonction en passant un autre rappel qui accepte à la fois a et b mais ne renvoie que b.

Et de la même manière, la fonction cdr fait avec b

1
Ravindra Thorat 18 mars 2019 à 09:20