| 
	| 
	
	| 
		
	| 
			
			 
			
				15.06.2011, 22:43
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 15.06.2011 
						Сообщений: 8
					 
		
 |  |  
	| 
				Глобальная переменная, интересная задача JS
			 
var foo = 10;   
function bar() {
     foo = 20;
     var foo = 30;
}   
bar();
console.log( "Foo = " + foo);
//Вывод 
Foo = 10
 
Кто нибудь знает почему?    
Как это объяснить?			 Последний раз редактировалось Graphis, 16.06.2011 в 19:34.
				Причина: Сделать более читаемым
 |  |  
	| 
		
	| 
			
			 
			
				15.06.2011, 23:09
			
			
			
		 |  
	| 
		
			|  | Модератор       |  | 
					Регистрация: 27.04.2010 
						Сообщений: 3,417
					 
		
 |  |  
	| Потому что не важно, где вы внутри ф-ции объявили переменную. Важно, что она была объявлена, а значит - локальная. |  |  
	| 
		
	| 
			
			 
			
				15.06.2011, 23:27
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.05.2009 
						Сообщений: 1,163
					 
		
 |  |  
	| Потому, что команда вар определяется при входе в контекст функции, а все действия на втором шаге во время построчного исполнения.1. var foo -> foo === undefined, window.foo === 10
 2. foo = 20 -> foo === 20, window.foo === 10
 3. foo = 30 -> foo === 30, window.foo === 10
 
				__________________Нужно равняться на лучших, а не оправдываться за счёт худших.
 |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 18:28
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 15.06.2011 
						Сообщений: 8
					 
		
 |  |  
	| Ок, но если сделать так: 
var foo = 10;
function bar() {
     foo = 20;
}
bar();
console.log( "Foo = " + foo);
//Вывод 
Foo = 20
 
Тогда почему сейчас foo = 20?			 Последний раз редактировалось Graphis, 16.06.2011 в 19:50.
				Причина: Сделать более читаемым
 |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 18:37
			
			
			
		 |  
	| 
		
			
			| х.з     |  | 
					Регистрация: 21.11.2010 
						Сообщений: 4,588
					 
		
 |  |  
	| 
	
 
	| Сообщение от Graphis |  
	| Тогда почему сейчас foo = 20? |  
	
 потому что глобальной в этом случае значение присваивается. а в примере ранее -помимо глобальной объявлялась ещё и локальная в функции. и работа внутри функции шла с локальной,а после функции выводилось значение глобальной. |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 18:37
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 06.05.2009 
						Сообщений: 1,163
					 
		
 |  |  
	| Потому, что foo глобальная переменная и объявлена вне функции, в функции объявление переменной нет вообще, то есть даже значения undefined нет, по этому поиск переменной переходит на контекст выше - глобальный. 
Алгоритм парсинга контекста повторяется для каждого контекста, а не в общем для всех.
http://dmitrysoshnikov.com/ecmascrip...tion-contexts/
http://dmitrysoshnikov.com/ecmascrip...4-scope-chain/
				__________________Нужно равняться на лучших, а не оправдываться за счёт худших.
 			 Последний раз редактировалось Nekromancer, 16.06.2011 в 18:39.
 |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 19:21
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 15.06.2011 
						Сообщений: 8
					 
		
 |  |  
	| Получается что JS интерпретатор обнаружив объявление переменнойс помощью ключевого слова var - выполняет первее всего.
 И неважно в каком месте, в тексте функции, оно стоит
 (будь var foo ниже строки где переменная используется)
 
 Правильно?
 |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 19:25
			
			
			
		 |  
	| 
		
			
			| Новичок на форуме       |  | 
					Регистрация: 19.02.2008 
						Сообщений: 9,177
					 
		
 |  |  
	| Да. |  |  
	| 
		
	| 
			
			 
			
				16.06.2011, 21:01
			
			
			
		 |  
	| 
		
			|  | Новичок на форуме       |  | 
					Регистрация: 15.06.2011 
						Сообщений: 8
					 
		
 |  |  
	| Всем, спасибо  |  |  
	| 
		
	| 
			
			 
			
				17.06.2011, 09:24
			
			
			
		 |  
	| 
		
			|  | CacheVar       |  | 
					Регистрация: 19.08.2010 
						Сообщений: 14,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от Graphis |  
	| Получается что JS интерпретатор |  
	
 Получается что это и не интерпретатор вовсе...    Потому как интерпретатор, в своём классическом виде, обрабатывает строка за строкой - тогда твой первый пример сработал. |  |  |  |