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