Объясните как работает данный код?
Все никак не могу разобраться, почему данный код выводит 1 вместо 10. Ведь мы при вызове функции мы указали, что внешнюю переменную изменяем на 10. Возможно проблема заключается в функции, которую мы объявили внутри функции b, она возможно поднимается вверх внутри функции b(hoisting), но я не до конца понимаю механизм работы.
var a = 1;
function b() {
a = 10;
return;
function a() {}
}
b();
alert(a);
Ответы (2 шт):
Думаю как то так
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);
то получите желаемый результат
Прочитайте про неявное определение локальных переменных: https://habr.com/ru/post/78991/
Хотя внутри функциии b и нет ключевого слова var, переменная a в ней переопределяется и именно ей присваивается значение 10. При этом функция не возвращает значение внутренней переменной и к тому же не присваивается какой-то переменной. Поэтому глобальная переменная a как была равна 1, так и остаётся.