Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объединить несколько функций в одну (https://javascript.ru/forum/misc/53752-obedinit-neskolko-funkcijj-v-odnu.html)

ivanWantsToKnow 16.02.2015 21:22

Объединить несколько функций в одну
 
Есть такая задача - реализовать функцию compose, которая принимает аргументами любое количество функций, и возвращает функцию, которая при вызове вызовет все функции, которые compose получила аргументом.
Я сделал следующее:
function compose() {
	var arr = [];
	for(var i = 0; i < arguments.length; i++) {
		arr.push(arguments[i]);
	}
	return function() {
		var calledFunction = [];
		for(var j = 0; i < arr.length; i++) {
			calledFunction.push(arr[i]());
			return calledFunction;
		}	
	}
}

поясняю: поскольку наша функция может принимать любое количество аргументов, то целесообразно использовать объект arguments, но поскольку он не массив по своей сути, а array-like, то я с создаю пустой массив и далее с помощью цикла for прохожусь по элементам arguments и записываю их в новый массив из всех переданных нам аргументов.
Далее я возвращаю функцию (как по условию) в которой проделываю тот же трюк, но теперь в новый массив я записываю вызванные функции . В итоге код не отрабатывает... в чем проблема? помогите разобраться...

рони 16.02.2015 21:45

ivanWantsToKnow,
строка 8 где i ?
строка 10 это почему тут?

ivanWantsToKnow 16.02.2015 21:55

это ужас. опять делаю эти ошибки... спасибо большое, теперь все работает!!!

caetus 16.02.2015 22:00

зачем создавать массив ? можно вот так делать!
var fn = function () {
	var arg = arguments;
	return function () {
		for(var i = 0; i < arg.length; i++) {
			arg[i]()
		}
	}
}
var f = fn(function(){alert(1)},function(){alert(2)},function(){alert(3)},function(){alert(4)})

f();

ivanWantsToKnow 16.02.2015 23:20

действительно, нагромоздил лишнего. так гораздо чище и без лишних движений! спасибо!

caetus 16.02.2015 23:53

https://developer.mozilla.org/ru/doc.../Array/forEach тут про функции forEach map и т.д

call передает силку на this
ПРИМЕР

var o = {
 name: 'Андрей'
}


function fn (age) {
alert(this.name+ '  ' + age);
}

fn.call(o, 22)




//arguments это не array ! но arguments может пользоваться методами массива 

function f(){
	Array.prototype.push.call(arguments, 1);
	console.log(arguments) // посмотри в консоль ))
}

f(0,2,3)

nerv_ 16.02.2015 23:59

любопытства ради на es6 написал :)

можно еще короче, но выглядит ядрено

говнокод выйдет на новый уровень)))

caetus 17.02.2015 00:02

5to6 все поддерживает от ES 6 ?)
классы промиси и т.д !)

ivanWantsToKnow 17.02.2015 00:05

caetus,
спасибо за информацию и наглядный пример, в теории сталкивался, но "в реальной жизни" не применял. буду изучать :)

pidorg-from-air,
не, лекции не надо. не ясна передача function(f){f()} в качестве второго аргумента в call. подскажи что почитать, чтобы это понять. заранее спасибо!

caetus 17.02.2015 00:07

почитай про forEach все станет понятно

ivanWantsToKnow 17.02.2015 00:14

caetus,
ок, уже читаю. спасибо еще раз за советы :)

nerv_ 17.02.2015 00:17

Цитата:

Сообщение от caetus
5to6 все поддерживает от ES 6 ?)
классы промиси и т.д !)

http://kangax.github.io/compat-table/es6/#babel


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