Каррирование - способ предварительного заполнения первых нескольких аргументов функции (а также возврата новой функции).
Т.е., я могу в коде предварительно заполнить несколько аргументов, а при вызове указать недостающие?
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.
Комментариев нет:
Отправить комментарий