Давайте поговорим о том, что же такое область видимости в языке JavaScript.
Любая переменная или функция, которая объявлена не в теле другой функции,
объявлена в глобальной области видимости.
Давайте схематично изобразим это так.
Переменная text и функция greet объявлены в глобальной области
видимости и доступны нам на протяжении всего кода.
Если мы вызовем свойство text у объекта global,
то мы получим значение, которое лежит в переменной text.
Новую область видимости можно создать при помощи функции.
Если мы объявляем функцию greet, то создается новая область видимости,
в которую помещаются все аргументы и переменные,
которые объявлены в этой функции.
Таким образом, мы получаем в глобальной области видимости функцию greet,
а в области видимости функции — переменную text.
Как только функция заканчивается, перестает быть доступной переменная text.
То есть если мы вызываем переменную text за пределами функции, мы получаем ошибку.
В соответствии со спецификацией ECMAScript 5.1 область видимости создается
только функцией.
То есть если мы объявим некоторую переменную в блоке кода, например,
операторе if, то переменная будет доступна за пределами этого кода.
Внутри функции мы можем также объявлять другие функции.
Это называется «вложенные функции».
При этом переменные, которые объявлены в родительской функции,
становятся доступными в функции дочерней.
Если объявить переменные с одним и тем же именем в родительской функции и в
дочерней, то интерпретатор будет себя вести следующим образом.
В родительской функции, в области ее видимости,
создастся переменная с именем text и значением «Привет».
На протяжении области видимости родительской функции нам будет доступна
эта переменная.
Но если мы объявляем переменную с именем «Привет» внутри дочерней функции,
то в области видимости дочерней функции при обращении к переменной text мы
получим значение «Пока».
Когда закончится тело дочерней функции,
мы снова получим значение «Привет» при обращении к переменной text.
Это поведение называется «затенение».
Таким образом, в JavaScript существует несколько областей видимости:
глобальная область видимости и область видимости,
которая создается при объявлении каждой новой функции.