Объясните как работает данный код?

Все никак не могу разобраться, почему данный код выводит 1 вместо 10. Ведь мы при вызове функции мы указали, что внешнюю переменную изменяем на 10. Возможно проблема заключается в функции, которую мы объявили внутри функции b, она возможно поднимается вверх внутри функции b(hoisting), но я не до конца понимаю механизм работы.

var a = 1; 
function b() { 
    a = 10; 
    return; 
    function a() {} 
} 
b(); 
alert(a);


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

Автор решения: Aziz Umarov

Думаю как то так

var a = 1; // объявление глобальной переменной
function b() { // объявление глобальной функции b 
    a = 10; // изменение значение переменной а и присваивание 10        
    return; // возврат из функции b с результатом 
    function a() {} // объявление замкнутой функции а в теле функции b
} 
b(); // вызов функции b
alert(a); // показать диалог со значением a

причина банальна в

function a() {} равносильна

var a = function () {}

то есть переменную а перекрывает определение функции. Именованные функции создают глобальную переменную, которая поднимается как бы вверх не зависимо от того где она была определена.

если сделать так

var a = 1; 
function b() { 
    a = 10; 
    return; 
    //function a() {} 
} 
b(); 
alert(a);

то получите желаемый результат

→ Ссылка
Автор решения: Quazimorda

Прочитайте про неявное определение локальных переменных: https://habr.com/ru/post/78991/

Хотя внутри функциии b и нет ключевого слова var, переменная a в ней переопределяется и именно ей присваивается значение 10. При этом функция не возвращает значение внутренней переменной и к тому же не присваивается какой-то переменной. Поэтому глобальная переменная a как была равна 1, так и остаётся.

→ Ссылка