Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.06.2011, 22:43
Аватар для Graphis
Новичок на форуме
Отправить личное сообщение для Graphis Посмотреть профиль Найти все сообщения от Graphis
 
Регистрация: 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. Причина: Сделать более читаемым
Ответить с цитированием
  #2 (permalink)  
Старый 15.06.2011, 23:09
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Потому что не важно, где вы внутри ф-ции объявили переменную. Важно, что она была объявлена, а значит - локальная.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #3 (permalink)  
Старый 15.06.2011, 23:27
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 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
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2011, 18:28
Аватар для Graphis
Новичок на форуме
Отправить личное сообщение для Graphis Посмотреть профиль Найти все сообщения от Graphis
 
Регистрация: 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. Причина: Сделать более читаемым
Ответить с цитированием
  #5 (permalink)  
Старый 16.06.2011, 18:37
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от Graphis
Тогда почему сейчас foo = 20?
потому что глобальной в этом случае значение присваивается. а в примере ранее -помимо глобальной объявлялась ещё и локальная в функции. и работа внутри функции шла с локальной,а после функции выводилось значение глобальной.
Ответить с цитированием
  #6 (permalink)  
Старый 16.06.2011, 18:37
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 16.06.2011, 19:21
Аватар для Graphis
Новичок на форуме
Отправить личное сообщение для Graphis Посмотреть профиль Найти все сообщения от Graphis
 
Регистрация: 15.06.2011
Сообщений: 8

Получается что JS интерпретатор обнаружив объявление переменной
с помощью ключевого слова var - выполняет первее всего.
И неважно в каком месте, в тексте функции, оно стоит
(будь var foo ниже строки где переменная используется)

Правильно?
Ответить с цитированием
  #8 (permalink)  
Старый 16.06.2011, 19:25
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Да.
Ответить с цитированием
  #9 (permalink)  
Старый 16.06.2011, 21:01
Аватар для Graphis
Новичок на форуме
Отправить личное сообщение для Graphis Посмотреть профиль Найти все сообщения от Graphis
 
Регистрация: 15.06.2011
Сообщений: 8

Всем, спасибо
Ответить с цитированием
  #10 (permalink)  
Старый 17.06.2011, 09:24
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,124

Сообщение от Graphis
Получается что JS интерпретатор
Получается что это и не интерпретатор вовсе... Потому как интерпретатор, в своём классическом виде, обрабатывает строка за строкой - тогда твой первый пример сработал.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальная переменная в функции Орёл Общие вопросы Javascript 1 18.12.2010 20:21
Глобальная переменная vah-smile Общие вопросы Javascript 3 06.07.2010 12:41
Глобальная переменная, считать правильнае значение в функции konstantinopol Общие вопросы Javascript 11 01.05.2010 23:28
Переменная JS как индекс в PHP mirage009 Серверные языки и технологии 4 28.02.2010 21:01
Глобальная переменная и массив mikeles Events/DOM/Window 2 21.11.2009 18:37