Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   curry javascript (https://javascript.ru/forum/events/42079-curry-javascript.html)

linklee 11.10.2013 14:38

curry javascript
 
Functions are values, and we can manipulate function values in interesting ways.
Curryingallows us to produce a new function by combining a function and an
argument:
var add1 = add.curry(1);
document.writeln(add1(6)); // 7

Function.method('curry', function ( ) {
 var slice = Array.prototype.slice,
 args = slice.apply(arguments),
 that = this;
 return function ( ) {
 return that.apply(null, args.concat(slice.apply(arguments)));
 };
});

нашел такое в одной книжке
как это вообще работает никто не обьяснит?

Octane 13.10.2013 13:10

1. Что делает функция add? Предположу, что слудующее:
function add() {
	var sum = 0, i = arguments.length;
	while (i--) {
		sum += arguments[i];
	}
	return sum;
}


2. Что делает Function.method? Скорее всего это какое-то сокращение для defineProperty и можно записать так:
Function.prototype.curry = function () {
	var slice = Array.prototype.slice,
		args = slice.apply(arguments), // массив аргументов [1]
		that = this; // ссылка на функцию add
	return function () {
		return that.apply(null, args.concat(slice.apply(arguments)));
	};
};

метод curry возвращает новую функцию, которая вызывает функцию add с аргументами 1 и 6

запишу чуть более понятно:
Function.prototype.curry = function () {

	var boundArgs = Array.from(arguments), // массив запоминающихся аргументов [1]
		func = this; //ссылка на функцию add

	return function () {
		var newArgs = Array.from(arguments), // массив новых аргументов [6]
			allArgs = boundArgs.concat(newArgs); // массив всех аргументов [1, 6]
		return func.apply(null, allArgs); // вызываем функцию add(1, 6)
	};
};


Часовой пояс GMT +3, время: 08:29.