 
			
				21.09.2009, 13:25
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		Получается, что нет: 
alert(
(function(a, b) {
	return new Function('return a + b;');
})(5, 6)()
);
происходит ошибка, если бы функция создаваемая через "new Function" запоминала "a" и "b", то вывелось бы 11, как здесь:
 
alert(
(function(a, b) {
	return function() {return a + b};
})(5, 6)()
);
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Riim, 21.09.2009 в 13:28.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:34
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор Всея Форума 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 4,021
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Riim
			
		
	 | 
 
	| 
		если бы функция создаваемая через "new Function" запоминала "a" и "b", то вывелось бы 11.
	 | 
 
	
 
 И, соответственно, получилось бы замыкание...
 
В статье про замыкания есть такой код:
 
function addEvents2(divs) {
    for(var i=0; i<divs.length; i++) {    
        divs[i].innerHTML = i
        divs[i].onclick = function(x) {
            return function() { alert(x) }
        }(i)
    }
}
Т.е. как я понял,временная функция, после исполнения, возвращает уже функцию-обработчик, которая не использует внешних [[scope]] и, соответственно, нет никакого замыкания... 
Хоть бы это было так   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:39
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Флудер 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.07.2008 
					
					
					
						Сообщений: 1,271
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Riim
			
		
	 | 
 
	| 
		alert( (function(a, b) { return new Function('return a + b;'); })(5, 6)() );
	 | 
 
	
 
 
alert(
(function() {
    return new Function('a','b','return a + b;');
})()(5, 6)
);
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:40
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs". 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:41
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 ZoNT, 
и что, где функция созданная через "new Function" запомнила что-то замыканием? 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:46
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Флудер 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.07.2008 
					
					
					
						Сообщений: 1,271
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:49
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор Всея Форума 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 4,021
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Riim
			
		
	 | 
 
	| 
		Как же нет, "x" то он (обработчик) запомнил, кроме того внутри видны "i" и "divs".
	 | 
 
	
 
   блин, точно... Как мне создать ф-цию, передать ей аргументы и оградить от внешнего [[scope]]?
   
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 13:55
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Рассеянный профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 06.04.2009 
					
					
					
						Сообщений: 2,379
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от ZoNT
			
		
	 | 
 
	| 
		Функция через new Function ничего не запоминает, так как формат её создания не подразумевает передачи в неё каких-либо ссылок...
	 | 
 
	
 
 угу, в этом и был вопрос.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 14:02
			
			
			
		  
	 | 
 
	
		
		
		
			
			| 
			
				
				
				 Флудер 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 25.07.2008 
					
					
					
						Сообщений: 1,271
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от Riim
			
		
	 | 
 
	| 
		угу, в этом и был вопрос.
	 | 
 
	
 
 Если вопрос только в этом то надо было писать так:
 
alert(
(function(a, b) {
    return new Function('return ' + a + ' + ' + b + ';');
})(5, 6)()
);
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				21.09.2009, 14:05
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Модератор Всея Форума 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 14.05.2009 
					
					
					
						Сообщений: 4,021
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	| 
	
	
		
		
		
		
		 Это всё понятно... как передать внешнюю переменную в создаваемую ф-цию, не оставляя ссылки на scope?! Может можно как-то через prototype решить... Ну или в заранее созданную... 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |