Почему не происходит всплытие переменной?

//var a;
a;
a = 10;
console.log(a);

Я использую "а", по идее должно произойти всплытие - переменная должна сама объявиться, дальше переменной "а" присваивается значение 10. Почему не выводится 10?

Здесь же все работает нормально, хотя переменная не была объявлена заранее:

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

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


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

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

Насколько я понимаю, в нестрогом режиме есть правило о необъявленных переменных (которые становятся глобальными):

Необъявленные переменные не существуют до тех пор, пока к ним не выполнено присваивание.

Отсюда: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/var

Разница в вашем коде не зависит от функции. Попробуйте сравнить два кода:

a;
a = 10;

Код без присваивания вызывает ошибку, а с присваиванием — не вызывает (не в strict mode).

Внутри функций то же самое:

(function bar() { a ; })();

вызывает ошибку, а

(function bar() { a = 10 ; })();

не вызывает (не в strict mode).

→ Ссылка
Автор решения: Qwertiy

Потому что всплывает объявление, а объявления ут ебя нет. Вот так нормально:

a;
var a = 10;
console.log(a);

→ Ссылка