Страницы

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

суббота, 22 июня 2019 г.

Каррирование в 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
Правильно ли я все понял с каррированием, и где может быть ошибка?


Ответ

Этот код рабочий.
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.

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

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