Когда мы в первый раз обсуждали понятие области видимости переменной, я оп_ ределил его только на основе лексической структуры JavaScript_кода: глобаль_ ные переменные имеют глобальную область видимости, а переменные, объяв_ ленные в функции, – локальную. Если одно определение функции вложено
1 Это отход от темы; если он вам неинтересен, спокойно переходите к следующему разделу.
76 Глава 4. Переменные
в другое, то переменные, объявленные в этой вложенной функции, имеют вло_ женную локальную область видимости. Теперь, когда мы знаем, что глобальные переменные представляют собой свойства глобального объекта, а локальные – свойства особого объекта вызова, мы можем вернуться к понятию области види_ мости переменной и переосмыслить его. Это даст нам хорошую возможность по_ новому взглянуть на существование переменных во многих контекстах и глубже понять, как работает JavaScript.
В JavaScript с каждым контекстом исполнения связана цепочка областей види' мости (scope chain), представляющая собой список, или цепочку, объектов. Ко_гда JavaScript_коду требуется найти значение переменной x (этот процесс назы_ вается разрешением имени переменной), он начинает поиск в первом (наиболее глубоком) объекте цепочки. Если в этом объекте отыскивается свойство с име_ нем x, то используется значение этого свойства. Если в первом объекте не удает_ ся найти свойство с именем x, то JavaScript продолжает поиск в следующем объ_ екте цепочки. Если во втором объекте тоже не найдено свойство с именем x, по_ иск продолжается в следующем объекте, и т. д.
В JavaScript_коде верхнего уровня (в коде, не содержащемся ни в одном из опре_ делений функций), цепочка областей видимости состоит только из глобального объекта. Все переменные разыскиваются в этом объекте. Если переменная не су_ ществует, то ее значение равно undefined. В функции (не вложенной) цепочка об_ ластей видимости состоит из двух объектов. Когда функция ссылается на пере_ менную, в первую очередь проверяется объект вызова (локальная область види_ мости), во вторую очередь – глобальный объект (глобальная область видимости). Вложенная функция будет иметь три или более объектов в цепочке областей ви_ димости. Процесс поиска имени переменной в цепочке областей видимости функции иллюстрирует рис. 4.1.
Рис. 4.1. Цепочка областей видимости и разрешения имени переменной