Почему объявление функции не перезаписывает одноимённую переменную?
Обычно попытка объявить функцию 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
})()
Объясните, почему столько вариантов?