![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.06.2011, 22:43
|
![Аватар для Graphis](https://javascript.ru/forum/image.php?u=14053&dateline=1308234640) |
Новичок на форуме
|
|
Регистрация: 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.
Причина: Сделать более читаемым
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.06.2011, 23:09
|
![Аватар для trikadin](https://javascript.ru/forum/image.php?u=7056&dateline=1455624363) |
Модератор
|
|
Регистрация: 27.04.2010
Сообщений: 3,417
|
|
Потому что не важно, где вы внутри ф-ции объявили переменную. Важно, что она была объявлена, а значит - локальная.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
15.06.2011, 23:27
|
![Аватар для Nekromancer](https://javascript.ru/forum/image.php?u=2395&dateline=1263970894) |
Профессор
|
|
Регистрация: 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
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 18:28
|
![Аватар для Graphis](https://javascript.ru/forum/image.php?u=14053&dateline=1308234640) |
Новичок на форуме
|
|
Регистрация: 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.
Причина: Сделать более читаемым
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 18:37
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Graphis
|
Тогда почему сейчас foo = 20?
|
потому что глобальной в этом случае значение присваивается. а в примере ранее -помимо глобальной объявлялась ещё и локальная в функции. и работа внутри функции шла с локальной,а после функции выводилось значение глобальной.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 18:37
|
![Аватар для Nekromancer](https://javascript.ru/forum/image.php?u=2395&dateline=1263970894) |
Профессор
|
|
Регистрация: 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.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 19:21
|
![Аватар для Graphis](https://javascript.ru/forum/image.php?u=14053&dateline=1308234640) |
Новичок на форуме
|
|
Регистрация: 15.06.2011
Сообщений: 8
|
|
Получается что JS интерпретатор обнаружив объявление переменной
с помощью ключевого слова var - выполняет первее всего.
И неважно в каком месте, в тексте функции, оно стоит
(будь var foo ниже строки где переменная используется)
Правильно?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 19:25
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Да.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
16.06.2011, 21:01
|
![Аватар для Graphis](https://javascript.ru/forum/image.php?u=14053&dateline=1308234640) |
Новичок на форуме
|
|
Регистрация: 15.06.2011
Сообщений: 8
|
|
Всем, спасибо ![](https://javascript.ru/forum/images/smilies/smile.gif)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
17.06.2011, 09:24
|
![Аватар для ksa](https://javascript.ru/forum/image.php?u=8616&dateline=1282216923) |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,237
|
|
Сообщение от Graphis
|
Получается что JS интерпретатор
|
Получается что это и не интерпретатор вовсе... ![Laugh](https://javascript.ru/forum/images/smilies/laugh.gif) Потому как интерпретатор, в своём классическом виде, обрабатывает строка за строкой - тогда твой первый пример сработал.
|
|
|
|