Maison  >  Article  >  interface Web  >  Idées et code source pour implémenter la fonction curry en JavaScript

Idées et code source pour implémenter la fonction curry en JavaScript

不言
不言avant
2018-11-20 15:22:452165parcourir

Ce que cet article vous apporte, ce sont les idées et le code source pour implémenter les fonctions de curry en JavaScript. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Effet d'implémentation

const curry_fn = curry(fn);
fn(1, 2, 3) == curry_fn(1)(2)(3);

Idée d'implémentation

  1. Stocker les paramètres entrants jusqu'à la fermeture

  2. Récupérer le nombre de paramètres grâce à l'attribut length de la fonction

  3. Lorsque le nombre de paramètres n'est pas suffisant, renvoyer directement les paramètres stockés dans la méthode

  4. Exécuter la fonction d'origine lorsque le nombre est égal au nombre de paramètres de la fonction d'origine

  • Si vous utilisez la valeur par défaut du paramètre ES6, la longueur sera ne soit pas égal au nombre réel de paramètres

  • Les paramètres sont obtenus à partir des arguments, ES6 utilise directement les paramètres de repos pour implémenter

Implémentation du code source

function curry(fn) {
    var length = fn.length; //获取原函数的参数个数
    var args = []; // args存储传入参数
    return function curryFn() {
        // 将arguments转换成数组
        var curryArgs = Array.prototype.slice.call(arguments); 
        args = args.concat(curryArgs);
        if (args.length > length) {
            throw new Error('arguments length error')
        }
        // 存储的参数个数等于原函数参数个数时执行原函数
        if (args.length === length) {
            return fn.apply(null, args);
        }
        // 否则继续返回函数
        return curryFn;
    };
}

Version ES6

function curry(fn) {
    let length = fn.length;
    let args = [];
    return function curryFn(...curryArgs) {
        args = args.concat(curryArgs);
        if (args.length > length) {
            throw new Error('arguments length error')
        }
        if (args.length === length) {
            return fn(...args);
        }
        return curryFn;
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer