Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Из области замыканий и рекурсивного определения (https://javascript.ru/forum/misc/60407-iz-oblasti-zamykanijj-i-rekursivnogo-opredeleniya.html)

uanr81 27.12.2015 17:02

Из области замыканий и рекурсивного определения
 
Здравствуйте. В учебнике попалась задача
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

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

Vlasenko Fedor 27.12.2015 17:37

Варианты решения:)

uanr81 27.12.2015 21:46

Рекурсивно делает ссылку на саму себя с уже переопределёнными переменными. Вопрос в этом и был, можно ли предупредить когда нужно вызвать функцию. Судя по ответам, существует проблема донести вопрос. Спасибо

uanr81 27.12.2015 22:01

Честно говоря не понял??

uanr81 27.12.2015 22:22

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

uanr81 27.12.2015 22:27

Карринг как я понял это создание новой функции с измененной функциональностью, а здесь я так понимаю игра с интерпретатором, с тем как создаётся объект функции и внешняя ссылка на объект вызова

uanr81 28.12.2015 00:40

Rise, это понятно. А если можно вызывать так ?
sum(2)()(5)();
. и не известно какое количество вызовов будет в выпажении. Спасибо за уделённое время


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