Добавляем...


  Область видимости переменной
    Область видимости переменной - это те части программы, откуда переменная остается видимой. Видимая, - значит, объявленная и доступная для использования. Переменная, которая видима во всей программе, называется глобальной. Переменная, видимая, например, только в рамках конкретной функции, называется локальной. Контекст - это набор определенных данных, формирующих среду выполнения программы. При запуске браузера создается глобальный контекст, в котором будет выполняться JavaScript. В дополнение к специфическим объектам браузера, подобным объекту Navigator, этот контекст включает также определения возможностей языка JavaScript (например, объекты Array и Math). Замечание. Если вы не имеете опыта программирования на JavaScript, можете только ознакомиться с содержимым следующих нескольких разделов и вернуться к ним тогда, когда почувствуете себя более уверенно в работе с этим языком.
Область видимости переменных и функции
    При вызове функции интерпретатор создает новый локальный контекст на все время ее выполнения. Все переменные, объявленные в функции (включая и ее аргументы), существуют только в рамках этого контекста. После возвращения функцией значения контекст уничтожается. Поэтому, если необходимо сохранить значение при многократном обращении к функции, следует объявить для этого значения глобальную переменную.

    Когда в функции встречается ссылка на переменную, интерпретатор сначала проверяет локальный контекст на наличие переменной с тем же именем. Если переменная не была объявлена в рамках локального контекста, интерпретатор проверяет объемлющий контекст. Если переменная не обнаружена в объемлющем контексте, интерпретатор повторяет процесс рекурсивно пока переменная не будет найдена или же не будет достигнут глобальный контекст.
    Важно отметить, что контексты проверяются в соответствии со структурой исходного кода, а не текущего дерева вызова. Этот вид обзора данных программой называют статическим {шли лексическим). В этом случае локально объявленные переменные могут скрывать переменные с теми же именами, но объявленные в объемлющем контексте. Вот пример, иллюстрирующий скрытие переменной:

var scope = "глобальная";
function myFunction()
{
var scope = "локальная";
document.writeln("Значение scope в myFunction: " + scope);
}
myFunction();
document.writeln("Значение scope в глобальном контексте: " + scope);

Локальная переменная scope скрывает значение глобальной переменной с именем scope. Удаление ключевого слова var из первой строки в myFunction приведет к тому, что глобальной переменной scope будет присвоено значение"локальная".
    Имеются некоторые тонкости, касающиеся области видимости переменных. Первая заключается в том, что каждое окно браузера имеет собственный глобальный контекст. Поэтому на первый взгляд не очень понятно, как получить доступ к данным в других окнах браузера и управлять ими. К счастью, JavaScript предоставляет возможность делать это с помощью доступа к фреймам и другим именованным окнам. Механика взаимодействия между окнами обсуждается в последующих главах, в частности в главе 12.
    Вторая тонкость, связанная с правилами обзора данных, такова: независимо от того, где именно в контексте объявлена переменная, она будет видима в рамках всего контекста. Это значит, что переменная, объявленная в конце функции, будет видима во всей функции. Однако инициализация переменной, включенная в декларацию, будет выполнена только при достижении соответствующей строки программного кода. В результате оказывается возможным доступ к переменной до ее инициализации, как в следующем примере:

function myFunction()
{
document.writeln("Значением х до инициализации в myFunction является ", x) ;
var х = "Hullo there!";
document.writeln("Значением х после инициализации в myFunction является", x) ;
}
myFunction() ;

В результате его выполнения получим:
Значением х до инициализации в myFunction является undefined
Значением х после инициализации в myFunction является Hullo there

Третья тонкость связана со статическим обзором данных. Рассмотрим следующий программный код:

var scope = "global";
function outerFunction()
(
var scope = "local";
innerFunction();
}
function innerFunction()
{
alert("Значением переменной scope является " + scope);
)
outerFunction();

В результате его выполнения получим:
"Значение переменной scope является global"

    Этот пример иллюстрирует очень важный аспект статического обзора данных: значение переменной scope, видимой в inner Function, существует в окружении объемлющего глобального контекста, и это значение - "global". Значение, установленное в outerFunction, не является здесь видимым, поскольку оно локально и, таким образом, невидимо за пределами функции. Значение для scope было найдено интерпретатором в результате проверки объемлющего контекста в оригинальном исходном коде JavaScript. Интерпретатор может сделать правильное заключение по поводу значения с помощью "статической" проверки текста программы. Поэтому такой анализ и называется "статическим обзором данных".
Область видимости переменных и обработка событий
    Переменные, объявленные внутри функции, являются локальными по отношению к этой функции. То же правило применимо и к программному коду JavaScript, включенному в программы обработки событий: текст обработчика событий - это его собственный контекст. Следующий сценарий иллюстрирует это. В нем объявляется глобальная переменная х, как и переменная х внутри программы обработки события:

‹script type="text/javascript"›
var x = "глобальная";
‹/script›
‹form action="#" method="get"›
‹input type="button" value="Cнaчaлa укажите на меня!"
onmouseover="var x = 'локальная'; alert ('Здесь переменная x ' + x);" /›
‹input type="button" value="A потом укажите на меня! "
onmouseover="alert('Здесь переменная х ' + х);" /›
‹/form›

    Поместите указатель мыши на первую кнопку; вы увидите, что переменной х в этом контексте будет присвоено значение "локальная". Вы сможете убедиться, что это не глобальная переменная х, переместив указатель мыши на вторую кнопку. Значением, показанным второй кнопкой, будет "глобальная", и это доказывает, что переменная х, установленная в первом обработчике событий, не была глобальной переменной с тем же именем. Поскольку в JavaScript применяется статический обзор данных, только переменные, объявленные в тексте программы обработки события, имеют собственный контекст. Рассмотрим следующий пример:

‹script type="text/javascript">
var x = "глобальная"; function printx()
(
alert("Внутри этой функции х " + х);
)
‹/script>
‹form action="#" method="get">
‹input type="button" value="Укажитe на меня!"
onmouseover="var x = 'локальная'; printx();" /> ‹/form>

    Значением x, которое будет показано, является "глобальная". Здесь снова работает статический обзор данных: поскольку контекст функции printx является глобальным, функция не видит локального значения, установленного в тексте программы обработки события.


добавить комментарий
(без перезагрузки и регистрации)


10 случайных разделов

Что ищем на сайте ?


Примеры кода на сайте







@ 2008-2011 Amber
При использовании материалов ссылка на сайт обязательна
Яндекс.Метрика