#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.
Комментариев нет:
Отправить комментарий