Почему объявление функции не перезаписывает одноимённую переменную?

Обычно попытка объявить функцию x после одноимённой переменной вызывает ошибку.

var x = 1; // или без присваивания - одинаково.
function x () {console.log('hw')}; // Identifier 'x' has already been declared

Когда же я объявляю функцию x внутри самовызывающейся функции, ошибка не появляется.

(function() {
  var x;

  function x() {};
  console.log(typeof x); // function 
  x = 1;
  console.log(typeof x); // number
})()

А теперь присвоим переменной значение до объявления функции: x не перезаписана.

(function() {
  var x;
  x = 1;

  function x() {};
  console.log(typeof x); // number
})()

Объясните, почему столько вариантов?


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