| 
	| 
	
	| 
		
	| 
			
			 
			
				24.08.2012, 16:33
			
			
			
		 |  
	| 
		
			
			| Интересующийся       |  | 
					Регистрация: 01.07.2011 
						Сообщений: 11
					 
		
 |  |  
	| 
				Объясните, почему функция работает именно так.
			 Всем привет. 
Есть вопрос:
 
function addThree(x) {
    return x + 3;
}
function composed(func) {
    return function(x) {
        return func(func(x))
    }
}
var answer = composed(addThree)(4);
И не могу понять, что за странная передача аргумента в функцию - composed(addThree)(4) ?? 
Почему не вот так composed(addThree(4)) - я уже понял, что так нельзя, попробовал. Просто еще не сталкивался с подобным способом написания. Что в таком случае происходит? Ведь функция composed принимает только один параметр - func? Тогда что за странная запись (addThree)(4) ?
 
Новичок. Не судите строго   
Спасибо. |  |  
	| 
		
	| 
			
			 
			
				24.08.2012, 16:36
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| первая функция передаётся как аргумент, и возвращается новая функция, которая вызовет первую, передав ей первый аргумент.
 т.е. при первой скобке возвратится функция, которая будет вызывать переданную и передавать ей первый аргумент, а вторая скобка вызывает её.
 
 почему запоминается первая функция? это называется замыкание.
 |  |  
	| 
		
	| 
			
			 
			
				24.08.2012, 19:30
			
			
			
		 |  
	| 
		
			
			| Интересующийся       |  | 
					Регистрация: 01.07.2011 
						Сообщений: 11
					 
		
 |  |  
	| спасибо |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 19:15
			
			
			
		 |  
	| 
		
			|  | Интересующийся       |  | 
					Регистрация: 30.08.2012 
						Сообщений: 15
					 
		
 |  |  
	| Вопрос не по этой теме, но по примеру из данного раздела раздела "Декораторы" сайта learn.javascript.ru :
 
01	function doublingDecorator(f) {         
02	  return function() { 
03	    return 2*f.apply(this, arguments); // (*) 
04	  }; 
05	} 
06	  
07	// Использование: 
08	  
09	function sum(a, b) { 
10	  return a + b; 
11	} 
12	  
13	sum = doublingDecorator(sum); 
14	  
15	alert( sum(1,2) ); // 6 
16	alert( sum(2,3) ); // 10
 
в строке 13 мы записываем в переменную sum результат, и теперь данная переменная не должна указывать на функцию function sum(a, b) {...} 
Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить. |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 21:02
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| 
	
 
	| Сообщение от Kivi   |  
	| Вопрос не по этой теме, но по примеру из данного раздела раздела "Декораторы" сайта learn.javascript.ru: 
 01	function doublingDecorator(f) {
 02	  return function() {
 03	    return 2*f.apply(this, arguments); // (*)
 04	  };
 05	}
 06
 07	// Использование:
 08
 09	function sum(a, b) {
 10	  return a + b;
 11	}
 12
 13	sum = doublingDecorator(sum);
 14
 15	alert( sum(1,2) ); // 6
 16	alert( sum(2,3) ); // 10
 
 в строке 13 мы записываем в переменную sum результат, и теперь данная переменная не должна указывать на функцию function sum(a, b) {...}
 Кто может указать (где на сайте или в книге Флэнагана) этот момент можно понять, можно и самостоятельно объяснить.
 |  
	
 Она и не указывает на функцию sum - она указывает на новую функцию, которая будет вызывать sum (она находится в переменной "f").
 
Она сохраняется благодаря замыканию.
 
Статья, по которой Я понял замыкания ( я перечитал их около 10 штук), находится на хабре . |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 21:34
			
			
			
		 |  
	| 
		
			|  | Тлен       |  | 
					Регистрация: 02.01.2010 
						Сообщений: 6,601
					 
		
 |  |  
	| melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.)С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
 
				__________________ 29375, 35
 |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 22:24
			
			
			
		 |  
	| 
		
			
			| sinistral     |  | 
					Регистрация: 28.03.2011 
						Сообщений: 5,418
					 
		
 |  |  
	| 
	
 
	| Сообщение от Aetae   |  
	| melky, хорошо начинать с js - такие вещи как замыкания и прототипы кажутся очевидными и элементарными с самого начала.) С другой стороны если берёшся за другой язык - уже "нормальное" ООП кажется тёмным лесом и вообще непонятно нафига козе баян.))
 |  
	
 я помню, как я на C# пересел как-то раз ... я пытался передать в функцию два аргумента, а она требовала три - и я гуглил, что же это за фигня такая    в общем, через месяц я вернулся к JS   |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 23:12
			
			
			
		 |  
	| 
		
			|  | Интересующийся       |  | 
					Регистрация: 30.08.2012 
						Сообщений: 15
					 
		
 |  |  
	| Может и так, но я еще не до конца въехал.Замыкание - Объект с переменными внешней функции можно использовать из внутренней функции. (Илья Кантор)
Однако  все  эти  замыкания  представляют  интерес  лишь в только что рассмотренной ситуации, когда вложенная функция экспортируется за пределы области видимости, в которой она была  определена. Вложенные функции, используемые таким образом, нередко явно называют замыканиями. (Дэвид Флэнаган)
 
Если, здесь это все используется, то может кто-нибудь терминами глобальных объектов, областей видимости и этапами инициализации это все объяснить.
 
И еще, это нормальный вариант вот так делать или это пример "индусского кода" (надеюсь поданного специально чтоб лучше запомнилось, когда закипит мозг) ? ( сразу уточню, что не хотел сказать, что Илья Кантор выдает "индусский код", просто для новичков опытные говорят на "индусском")   . |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 23:19
			
			
			
		 |  
	| 
		
			|  | Тлен       |  | 
					Регистрация: 02.01.2010 
						Сообщений: 6,601
					 
		
 |  |  
	| Нормально. Но дело вкуса. Я, например, люблю замыкания и "замыкаю" всё подряд, а кто-то не любит.)) 
				__________________ 29375, 35
 |  |  
	| 
		
	| 
			
			 
			
				30.08.2012, 23:40
			
			
			
		 |  
	| 
		
			|  | Интересующийся       |  | 
					Регистрация: 30.08.2012 
						Сообщений: 15
					 
		
 |  |  
	| Я люблю и обожаю, но еще не все примеры разобрал.
 Может, объясниш этот случай.
 			 Последний раз редактировалось Kivi, 31.08.2012 в 00:00.
 |  |  |  |