Страницы

Поиск по вопросам

четверг, 9 апреля 2020 г.

Каррирование в JavaScript

#javascript #замыкания

                    
Каррирование - способ предварительного заполнения первых нескольких аргументов функции
(а также возврата новой функции). 

Т.е., я могу в коде предварительно заполнить несколько аргументов, а при вызове указать
недостающие?

Function.prototype.curry = function () {
    // Запомнить функцию и предварительно заполнить ее аргументами переменные
    var fn = this,
        args = Array.prototype.slice.call(arguments);
    // Эта функция должна получить на вход сохраненные аргументы и новые
    return function() {
        var arg = 0;
        // Объединить заранее подготовленные аргументы сохраненные в замыкании с
новыми аргументами 
        for (var i = 0; i < args.length && arg < arguments.length; i++) {
            if (args[i] === undefined) {
                args[i] = arguments[arg++];
            }
        }
        // вызвать каррирующую функцию со всеми аргументами
        return fn.apply(this, args);
    };
};


Т.е., если каррировать данную функцию:

function sum (a,b) 
    return a + b;


То можно вызвать ее следующим образом:

var addTwo = sum.carry(2);
addTwo(5); // Увеличение на 2
// Но на выходе NaN


Правильно ли я все понял с каррированием, и где может быть ошибка?
    


Ответы

Ответ 1



Этот код рабочий. Function.prototype.curry = function () { // Запомнить функцию и предварительно заполнить ее аргументами переменные var fn = this, args = Array.prototype.slice.call(arguments); // Эта функция должна получить на вход сохраненные аргументы и новые return function() { var arg = 0; // Объединить заранее подготовленные аргументы сохраненные в замыкании с новыми аргументами for (var i = 0; i < args.length || arg < arguments.length; i++) { if (args[i] === undefined) { args[i] = arguments[arg++]; } } // вызвать каррирующую функцию со всеми аргументами return fn.apply(this, args); }; }; function sum (a,b) { return a + b; } var addTwo = sum.curry(2); console.log(addTwo(5)); // Выводит 7 Ваши ошибки: надо в уcловии цикла, где объединяете массивы аргументов писать || а не &&, чтобы ориентироваться на самый длинный из массивов. Также вы допустили описку в var addTwo = sum.carry(2); - функция называется curry.

Комментариев нет:

Отправить комментарий