function scope sample 4 - garevna/js-course GitHub Wiki

:arrow_backward: scope

:coffee: 4

var __num = 1
function __showNum () {
        console.info ( "Вошли в контекст исполнения функции __showNum" )
        console.info ( `__num === ${__num}` )
        return
        function __num () {}
}
__showNum ()
console.info ( "Вышли из контекста исполнения функции __showNum" )
console.info ( `Теперь __num === ${__num}` )

В этом примере показано, как работает механизм hoisting

Переменная __num объявляется в глобальной области видимости с присвоением ей значения 1

Внутри тела функции __showNum после оператора return объявляется функция __num

На первый взгляд, при последовательном выполнении кода это объявление не должно сработать, поскольку оператор return стоит выше

Однако все объявления собираются в объект активации до того, как код начинает выполняться

Поэтому на момент, когда начнется выполнение кода функции __showNum, функция __num будет уже объявлена и будет благополучно находиться в Lexical Environment функции __showNum

Благодаря этому объявления переменных и функций "поднимаются" в области видимости "родителя" ( в нашем случае "родителем" является функция __showNum )

Убедиться в этом позволяет вывод в консоль переменной __num

После завершения выполнения кода функции __showNum ее контекст будет "демонтирован", и опять активным станет глобальный контекст, в котором переменная __num имеет значение 1

:arrow_backward: scope