Как работают области видимости JS?
Область видимости переменной зависит только от того, где она объявлена, и не зависит от цепочки вызовов. Так что если хотите зависимость по цепочке, то объявляйте одну функцию в другой. И почитайте про замыкания в JavaScript.
Приветствую. Вы немного заблуждаетесь.по логике он должен поискать ее из функции 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.