Начиная исполнять функцию, интерпретатор JavaScript создает для нее новый контекст исполнения (execution context), т. е. контекст, в котором выполняется
4.7. Еще об области видимости переменных
любой фрагмент JavaScript_кода. Важная часть контекста – объект, в котором определены переменные. Поэтому код JavaScript_программы, не являющийся частью какой_либо функции, работает в контексте исполнения, в котором для определений переменных используется глобальный объект. А любая JavaScript_ функция работает в собственном уникальном контексте исполнения с собствен_ ным объектом вызова, в котором определены локальные переменные.
Интересно отметить, что реализации JavaScript могут допускать несколько гло_ бальных контекстов исполнения с отдельным глобальным объектом каждый.1 (Хотя в этом случае каждый глобальный объект не является действительно гло_ бальным.) Очевидный пример – это клиентский JavaScript, в котором каждое отдельное окно броузера или каждый фрейм в окне определяет отдельный гло_ бальный контекст исполнения. Код клиентского JavaScript в каждом фрейме или окне работает в собственном контексте исполнения и имеет собственный глобальный объект. Однако эти отдельные клиентские глобальные объекты име_ ют свойства, связывающие их друг с другом. Другими словами, JavaScript_код в одном фрейме может ссылаться на другой фрейм с помощью выражения pa_ rent.frames[1], а на глобальную переменную x в первом фрейме можно сослаться из второго фрейма с помощью выражения parent.frames[0].x.
Вам не обязательно уже сейчас полностью понимать, как связываются вместе контексты исполнения отдельных окон и фреймов в клиентском JavaScript. Эту тему мы подробно рассмотрим при обсуждении интеграции JavaScript с веб_бро_ узерами в главе 13. Сейчас достаточно знать, что гибкость JavaScript позволяет одному интерпретатору JavaScript исполнять сценарии в различных глобаль_ ных контекстах исполнения и что этим контекстам не нужно быть совершенно раздельными – они могут ссылаться друг на друга.
Последнее утверждение надо рассмотреть подробнее. Если JavaScript_код в од_ ном контексте исполнения может читать и писать значения свойств и выполнять функции, определенные в другом контексте исполнения, то становятся актуаль_ ными вопросы безопасности. Возьмем в качестве примера клиентский Java_ Script. Предположим, что окно броузера A запускает сценарий или содержит ин_ формацию из вашей локальной сети, а окно B запускает сценарий с некоторого произвольного сайта в Интернете. Скорее всего, мы не захотим предоставлять коду в окне B доступ к свойствам в окне A. Ведь тогда этот код получит возмож_ ность прочитать важную корпоративную информацию и, например, украсть ее. Следовательно, безопасный запуск JavaScript_кода должен обеспечить специ_ альный механизм, предотвращающий доступ из одного контекста исполнения в другой, если такой доступ не разрешен. Мы вернемся к этой теме в разделе 13.8.