"Куда" происходит всплытие переменной?

Раньше думала, что всплытие происходит на самый верх области видимости переменной. То есть как тут. Так как переменная видна только в функции, то соответственно, объявление будет происходит в самом начале функции.

var foo = 1; 
function bar() { 
  //var foo; 
  if (!foo) { 
  var foo = 10; 
} 
console.log(foo); 
} 
bar();

Но уже здесь уже почему-то происходит объявление глобальной переменной, а не локальной.

//var a; 
function c() { 
a = 7; 
} 
c(); 
console.log(a);

Почему так работает?


Ответы (1 шт):

Автор решения: Grundy

При присваивании выполняется абстрактная операция PutValue

Как указано в спецификации в 5 пункте:

5. Если переменная не определена, то
    а. Если строгий режим
        i. Кинуть ошибку ReferenceError.

    b. Получить ссылку на глобальный объект.
    c. Установить в глобальном объекте свойство с именем соответствующим имени переменной и значением - соответствующим значению переменной.

Формально для браузера, код

function c() { 
  a = 7; 
} 

Эквивалентен

function c() { 
  window.a = 7; 
} 

В случае, если a нигде не объявлена.

→ Ссылка