 
			
				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.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |