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