Как работает этот простой javascript script (может быть, область видимости)?

Кто-нибудь может разбить меня на шаги, как это (это выглядит просто в первую очередь) интерпретируется браузером:

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

это принесет 1. Если бы я изменил имя функции на что-нибудь еще, и т.д.:

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

это предупредит 10.

Ответ 1

Область действия переменной, объявленной с помощью var - это вся функция, в которой она объявлена, она не начинается с точки объявления. Он часто описывается как подъем объявления переменных и может рассматриваться как перемещение всех объявлений переменных в начало функции. Для определений функций и объявление, и "назначение" перемещаются вместе.

function b() {
    a = 10;
    function a() {}
}

эквивалентно

function b() {
    var a  = function() {};
    a = 10;
}

это означает, что вы объявляете новую переменную a, а a = 10 изменяет только внутреннюю переменную a, а не внешнюю. Мы говорим, что внутренняя переменная a затеняет внешнюю.

Во втором случае во внутренней области нет переменной a, что означает, что внешняя используется и изменяется (при поиске переменной вы переходите из внутренней области в самую внешнюю после цепочки замыкания).