 
			
				29.09.2014, 23:47
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.09.2014 
					
					
					
						Сообщений: 77
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от extrabass4
			
		
	 | 
 
	| 
		Но, а как тогда заранее создастся LexicalEnvironment для var  sayH = function(), если присвоение произойдёт, только когда дойдём до этого участка кода?
	 | 
 
	
 
 Думаю, на втором проходе. Там 2-х проходной компилятор. Я предполагаю, что первый проход делается только для того, чтобы "поднять" fuinction declarations, хотя не уверен.
 
	
 
	| 
		
			Сообщение от extrabass4
			
		
	 | 
 
	| 
		оподробнее о сборщике мусора желательно с примером и алгоритмом действия.
	 | 
 
	
 
 https://developer.mozilla.org/ru/doc...ory_Management 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				29.09.2014, 23:50
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.09.2014 
					
					
					
						Сообщений: 77
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от bes
			
		
	 | 
 
	| 
		ссылки на объект закончились, можно удалять
	 | 
 
	
 
 Неправда. В js Алгоритм "Mark-and-sweep"  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				29.09.2014, 23:59
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 22.03.2012 
					
					
					
						Сообщений: 3,744
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от petya
			
		
	 | 
 
	| 
		Неправда. В js Алгоритм "Mark-and-sweep"
	 | 
 
	
 
 правда, вопрос в том, что понимать под  
	
 
	| 
		
			Сообщение от bes
			
		
	 | 
 
	| 
		ссылки на объект закончились
	 | 
 
	
 
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 00:06
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Аспирант 
				
				
				
				
	
 
 
			 | 
			  | 
			
				
				
					Регистрация: 02.09.2014 
					
					
					
						Сообщений: 77
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от bes
			
		
	 | 
 
	| 
		вопрос в том, что понимать под
	 | 
 
	
 
 Насколько я себе это представляю, "ссылки на объект НЕ закончились" не означает "Объект все еще нужен", в этом основная разница. А что еще можно под этим понимать?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 11:22
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2014 
					
					
					
						Сообщений: 20
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 спасибо, за столь интенсивную дисскусию. Постепенно всё встаёт на свои места в моей голове. 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось extrabass4, 30.09.2014 в 12:01.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 13:12
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2014 
					
					
					
						Сообщений: 20
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 function sayHi(person) { 
  
    var message = makeMessage(person); // (**) 
    alert( message ); 
 
  function getHello(age) { 
    return age >= 18 ? 'hello' : 'hi'; 
  } 
  function makeMessage() { 
    return getHello(person.age) + ', ' + person.name; 
  }  
} 
 
var say = sayHi({ name: 'LOL', age: 17 }); (*) 
 
   В  этом примере функция не возвращает функцию, поэтому как я понимаю происходит следующее: как только до  неё доходит интепритатор в коде (*) она сразу же выполняется и срабатывает встроенная функция alert - даже при таком вызове sayHi({ name: 'LOL', age: 17 }); в строке (*). 
 
   Но собственно,если function sayHi(person)  возвращает функцию, то всё иначе: 
 
function sayHi(person) { 
 
 return function() { 
    var message = makeMessage(person); // (**) 
    alert( message ); 
  }; 
 
  function getHello(age) { 
    return age >= 18 ? 'hello' : 'hi'; 
  } 
  function makeMessage() { 
    return getHello(person.age) + ', ' + person.name; 
  }  
} 
 
// (*) 
var call = sayHi({ name: 'LOL', age: 17 }); 
call(); 
 
    Вызвать функцию можно только таким способом, как в (*) сперва  
создав переменную ссылающуюся на функцию var call = sayHi({ name: 'LOL', age: 17 }); и передав в неё аргументы.  
 
    Но почему же нельзя просто вызвать её так sayHi({ name: 'LOL', age: 17 }); ? ведь при Function declaration  имя функции sayHi это переменная ссылающаяся на функцию ?  
Ведь если даже в первом примере сделать,чтоб функция return alert( message ); ? , то вызвать можно так: sayHi({ name: 'LOL', age: 17 }); 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 15:03
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.04.2012 
					
					
					
						Сообщений: 951
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()(); 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 16:21
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 24.09.2013 
					
					
					
						Сообщений: 1,436
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 И обрамляй код в тег JS, читать невозможно. 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 18:19
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Интересующийся 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.06.2014 
					
					
					
						Сообщений: 20
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Dim@
			 
		
	 | 
 
	| 
		потому что "чисто" внутри функции sayHi alert-а нету, но есть в возвращаемой (а не запускаемой) функции => чтобы вызвать alert надо написать sayHi()();
	 | 
 
	
 
 Спасибо, а  почему тогда запускается при: 
Var call = sayHi({ name: 'LOL', age: 17 }); 
call();
 
Каким образом это аналог sayHi()(); ?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				30.09.2014, 19:10
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 21.04.2012 
					
					
					
						Сообщений: 951
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		ну для начала, я немного тупанул, чтобы вызвать alert надо написать sayHi({ name: 'LOL', age: 17 })(); а аналог тем, что  
Var call = sayHi({ name: 'LOL', age: 17 });//call - ссылка на возвращаемую ф-ю
call();//её запуск
sayHi({ name: 'LOL', age: 17 })();//получение результата из sayHi т.е. ф-и и ТУТ ЖЕ её запуск
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 
 
 
 
	 | 
 
 
 |