Показать сообщение отдельно
  #1 (permalink)  
Старый 27.12.2015, 17:02
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Из области замыканий и рекурсивного определения
Здравствуйте. В учебнике попалась задача
sum(2, 5, 10); // 17
sum(2, 5)(10); // 17
sum(2)(5)(10); // 17
sum(2)(5, 10); // 17

Здесь жёстко было определено, что можно использовать только три числовых аргумента и функция должна вернуть результат. Здесь как бы не сложно, мой один из вариантов:
function sum(){
	var arg = arguments;
		var summa = sumArg(arg);
		var x = (3 - arg.length);
		if (!x) return summa;
		else
		return function a(){
			var arg = arguments;
			x -= arg.length;
			summa += sumArg(arg);
			if (!(x)) return summa;
			else return a;
		};
}


	function sumArg(arg){
	var itog = 0;
	var len = arg.length;
	for(var x = 0; x < len; x++){
		itog += arg[x];
	};
	return itog;
	}
	
sum(2, 5, 10); // 17
sum(2, 5)(10); // 17
sum(2)(5)(10); // 17
sum(2)(5, 10); // 17

Тут зная когда закончатся аргументы мы сделаем возврат значения (прервём цепочку создания объектов вызова и вернём значение "верхнего" замыкания, не сложно). Вопрос состоит вот в чём, как можно определить при выполнении функции (как бы вылезти наружу вперёд до окончания выполнения) как будет использоваться возвращаемое функцией значение. Если брать вышеуказанный пример, когда происходит последний вызов в выражении если заранее не известно количество предстоящих вызовов . Спасибо, извините за каламбур
Ответить с цитированием