var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar(); //--> 10
var foo;
var foo = 1; // можно стереть
function bar() {
var foo; // всплыло сюда. Этот foo – иной, чем верхний foo!
if (!foo) { // тут foo undefined, !foo === true
foo = 10; // выполняется, назначается 10
}
console.log(foo); // вывели 10
}
bar(); //--> 10
//var a;
function c() {
a = 7;
}
c();
console.log(a); //--> 7
a
становится только после вызова c();
var a;
ничего не меняет.a
не объявлена, её разыскивают выше, в контексте. В этом примере это сразу в глобальной области видимости. c();
, мы заходим в функцию, видим необъявленную "а", объявляем ее за пределами функции, снова возвращаемся в функцию, присваиваем "а" значение 7. JS это значение запоминает, идет вызов функции консоль, выводится 7. //var a;
a;
a = 10;
console.log(a); //a is not defined
var
, то нет никакого всплытия. Её ищут, сначала внутри функции, потом выше над ней – это в примере уже глобальный уровень. В JS всегда есть самый высший объект, корень, рут ) В браузере это объект window
.function bar() {
a = 17;
}
bar();
console.log(window.a) // выведет 17
a; // вот эта строка вызывает ошибку: пытаемся использовать что-то несуществующее
a = 10;
console.log(a); // тут уже всё ок, выводится 10
Так вот, когда без объявления обращаются к переменной, фактически используется свойство этого верхнего объекта (window).
var foo = 1;
function bar() {
//var foo;
if (!foo) {
var foo = 10;
}
console.log(foo);
}
bar();
var
. Оно всплывает. Наверх функции или глобального кода. var foo = 10;
при этом разорвёт как хомячка: объявление var foo;
уплывёт в начало функции, а назначение foo = 10;
останется на месте.a = 10
. Оно никуда не уплывает. Но вопрос, что за a
при этом получит значение ) Если дело внутри функции и в ней же было объявление, то она. Если объявили выше - оно. Если вообще не объявляли, то выше уж некуда, глобус получит ) function bar() {
var foo;
// ...
foo = 10; // свой, местный foo
}
var foo; // внешний
function bar() {
foo = 10; // внешний назначился
}
function bar() {
function zee() {
foo = 10;
}
}
не в zee, и не в bar, а выше, глобальный foo.function bar() {
function zee() {
foo = 10;
}
var foo; // всплывёт в начало ф-ии bar
}
в bar!