Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Глобальная переменная, интересная задача JS (https://javascript.ru/forum/misc/18074-globalnaya-peremennaya-interesnaya-zadacha-js.html)

Graphis 15.06.2011 22:43

Глобальная переменная, интересная задача JS
 
var foo = 10;   
function bar() {
     foo = 20;
     var foo = 30;
}   
bar();
console.log( "Foo = " + foo);

//Вывод
Foo = 10

Кто нибудь знает почему? :help:
Как это объяснить?

trikadin 15.06.2011 23:09

Потому что не важно, где вы внутри ф-ции объявили переменную. Важно, что она была объявлена, а значит - локальная.

Nekromancer 15.06.2011 23:27

Потому, что команда вар определяется при входе в контекст функции, а все действия на втором шаге во время построчного исполнения.
1. var foo -> foo === undefined, window.foo === 10
2. foo = 20 -> foo === 20, window.foo === 10
3. foo = 30 -> foo === 30, window.foo === 10

Graphis 16.06.2011 18:28

Ок, но если сделать так:
var foo = 10;
function bar() {
     foo = 20;
}
bar();
console.log( "Foo = " + foo);


//Вывод
Foo = 20

Тогда почему сейчас foo = 20?

dmitriymar 16.06.2011 18:37

Цитата:

Сообщение от Graphis
Тогда почему сейчас foo = 20?

потому что глобальной в этом случае значение присваивается. а в примере ранее -помимо глобальной объявлялась ещё и локальная в функции. и работа внутри функции шла с локальной,а после функции выводилось значение глобальной.

Nekromancer 16.06.2011 18:37

Потому, что foo глобальная переменная и объявлена вне функции, в функции объявление переменной нет вообще, то есть даже значения undefined нет, по этому поиск переменной переходит на контекст выше - глобальный.

Алгоритм парсинга контекста повторяется для каждого контекста, а не в общем для всех.

http://dmitrysoshnikov.com/ecmascrip...tion-contexts/
http://dmitrysoshnikov.com/ecmascrip...4-scope-chain/

Graphis 16.06.2011 19:21

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

Правильно?

Kolyaj 16.06.2011 19:25

Да.

Graphis 16.06.2011 21:01

Всем, спасибо :)

ksa 17.06.2011 09:24

Цитата:

Сообщение от Graphis
Получается что JS интерпретатор

Получается что это и не интерпретатор вовсе... :D Потому как интерпретатор, в своём классическом виде, обрабатывает строка за строкой - тогда твой первый пример сработал.


Часовой пояс GMT +3, время: 01:27.