@FaTaLcheG

Как работают области видимости JS?

Не могу понять что происходит на данном участке кода с var и без var (var x = 2; )

Мое понимае примерно такое, когда вызывается foo(); она вызывается из глобальной области видимости и после того как начнет отрабатывать тело функции function foo() он не найдет обьявленой переменной x в теле функции и сразу переключится на глобальную область где и найдет там обьявление var x = 10;

Далее следует вызов функции bar(); с var x = 2;, первым делом он обьявит переменную var x после чего присвоит ей значение 2, далее следует вызов функции return foo(); что важно из окружения function bar(), тело функции function foo() начнет выполнять выражение var y = x + 5; и опять тут не найдет переменную x, по логике он должен поискать ее из функции function bar() так как там ее вызывали return foo(); но по факту он обращается к глобальной области видимости и возвращает 10 var 15 = 10 + 5;

Но самое интересное так это если убрать обьявление var из функции function bar() { x = 2; return foo(); }; тогда функция function foo() ведет себя подругому и переменную x найдет не в глобальной области а в теле function bar(), так выражение в теле будет таким var 7 = 2 + 5;

var x = 10;

function foo() {
  var y = x + 5;
  console.log(y);
  return y;
}

function bar() {
  var x = 2;
  return foo();
}

foo();
bar();
console.log(x);


var x = 10;

function foo() {
  var y = x + 5;
  console.log(y);
  return y;
}

function bar() {
  x = 2;
  return foo();
}

foo();
bar();
console.log(x);
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
dollar
@dollar
Делай добро и бросай его в воду.
Область видимости переменной зависит только от того, где она объявлена, и не зависит от цепочки вызовов. Так что если хотите зависимость по цепочке, то объявляйте одну функцию в другой. И почитайте про замыкания в JavaScript.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
MalkovVladimir73
@MalkovVladimir73
Fullstack (node + vue.js)
Приветствую. Вы немного заблуждаетесь.
по логике он должен поискать ее из функции function bar() так как там ее вызывали return foo();

Обратите внимание в каком scope находе foo. Поэкспериментируйте с функцией и перенесите ее в scope bar. Примерно так:
var x = 10;

function bar() {
  var x = 2;
  return foo();

  function foo() {
    var y = x + 5;
    console.log(y);
    return y;
  }
}

foo();
bar();
console.log(x);

Т.к foo находится в глобальном scope (в вашем исходном примере), она всегда будет использовать глобальную переменную x.
Ответ написан
Комментировать
bitniks
@bitniks
Go/PHP/Symfony developer
foo() объявлена в глобальной области видимости, поэтому она всегда использует переменную x из глобальной области видимости, независимо от того, где её вызывают. Если в bar() убрать var, то поменяется глобальная переменная x, соответственно foo() выведет измененное значение глобальной переменной
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы