Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.02.2015, 21:22
Аватар для ivanWantsToKnow
Интересующийся
Отправить личное сообщение для ivanWantsToKnow Посмотреть профиль Найти все сообщения от ivanWantsToKnow
 
Регистрация: 29.01.2015
Сообщений: 15

Объединить несколько функций в одну
Есть такая задача - реализовать функцию 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 и записываю их в новый массив из всех переданных нам аргументов.
Далее я возвращаю функцию (как по условию) в которой проделываю тот же трюк, но теперь в новый массив я записываю вызванные функции . В итоге код не отрабатывает... в чем проблема? помогите разобраться...
Ответить с цитированием
  #2 (permalink)  
Старый 16.02.2015, 21:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

ivanWantsToKnow,
строка 8 где i ?
строка 10 это почему тут?
Ответить с цитированием
  #3 (permalink)  
Старый 16.02.2015, 21:55
Аватар для ivanWantsToKnow
Интересующийся
Отправить личное сообщение для ivanWantsToKnow Посмотреть профиль Найти все сообщения от ivanWantsToKnow
 
Регистрация: 29.01.2015
Сообщений: 15

это ужас. опять делаю эти ошибки... спасибо большое, теперь все работает!!!
Ответить с цитированием
  #4 (permalink)  
Старый 16.02.2015, 22:00
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

зачем создавать массив ? можно вот так делать!
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();
Ответить с цитированием
  #5 (permalink)  
Старый 16.02.2015, 23:20
Аватар для ivanWantsToKnow
Интересующийся
Отправить личное сообщение для ivanWantsToKnow Посмотреть профиль Найти все сообщения от ivanWantsToKnow
 
Регистрация: 29.01.2015
Сообщений: 15

действительно, нагромоздил лишнего. так гораздо чище и без лишних движений! спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 16.02.2015, 23:53
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

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)

Последний раз редактировалось caetus, 16.02.2015 в 23:57.
Ответить с цитированием
  #7 (permalink)  
Старый 16.02.2015, 23:59
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

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

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

говнокод выйдет на новый уровень)))
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук

Последний раз редактировалось nerv_, 17.02.2015 в 00:04.
Ответить с цитированием
  #8 (permalink)  
Старый 17.02.2015, 00:02
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

5to6 все поддерживает от ES 6 ?)
классы промиси и т.д !)
Ответить с цитированием
  #9 (permalink)  
Старый 17.02.2015, 00:05
Аватар для ivanWantsToKnow
Интересующийся
Отправить личное сообщение для ivanWantsToKnow Посмотреть профиль Найти все сообщения от ivanWantsToKnow
 
Регистрация: 29.01.2015
Сообщений: 15

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

pidorg-from-air,
не, лекции не надо. не ясна передача function(f){f()} в качестве второго аргумента в call. подскажи что почитать, чтобы это понять. заранее спасибо!
Ответить с цитированием
  #10 (permalink)  
Старый 17.02.2015, 00:07
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

почитай про forEach все станет понятно
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединить три конструкции проверки полей в одну golopogos Элементы интерфейса 0 27.01.2015 10:04
Вернуть return через несколько функций TheMilkMan Общие вопросы Javascript 4 25.06.2013 17:22
Функция для перевода размера из байтов в понятный для человека формат Антон Крамолов Ваши сайты и скрипты 4 05.04.2013 16:42
как завернуть несколько функций в одну syegorius Общие вопросы Javascript 3 21.09.2012 01:25
Объединить несколько выборок в одну float jQuery 4 12.07.2011 21:31