![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Область видимости переменных
Любая переменная, объявленная вне тела функции оператором var или созданная по умолчанию в операции присваивания, является глобальной и видна везде в любой части любого сценария страницы и внутри тела любой функции. Время жизни такой глобальной переменной — пока страница отображается в браузере. Переменная, объявленная с помощью оператора var в теле функции является локальной и видна только в теле той функции, где она объявлена. Ее время жизни — пока выполняется функция. Если в теле функции объявляется переменная по умолчанию в операции присваивания, то она будет иметь глобальную область видимости. Локальная переменная может иметь имя, совпадающее с глобальной, однако при вызове функции они будут рассматриваться как две различные переменные: aGlob = " g" // Глобальная переменнаяvar bGlob = " g" // Глобальная переменнаяfunction f(){// изменение значения глобальной переменной aGlob = " f" // создание новой глобальной переменной aFuncGlob = " f" // создание локальной переменной var aFunc = " f" // создание локальной переменной с именем глобальной var bGlob = " f" }После вызова функции f() значения переменных будут следующими: aGlob = " f" bGlob = " g" aFuncGlob = " f"Тогда как переменной aFunc существовать после завершения выполнения функции f() не будет. При обработке сценария интерпретатор сначала находит в нем все переменные, определенные оператором var, создает их в зависимости от определенной для них области видимости и присваивает им значения undefined, а потом уже начинает выполнять сценарий, присваивая переменным значения, вычисляемые в соответствующих операторах присваивания. Если он встречает при интерпретации сценария переменную, не объявленную оператором var, то он немедленно создает глобальную переменную с указанным именем. 4Пример 9. Область видимости переменных Поучительный пример на сказанное выше относительно создания интерпретатором переменных. Какое значение вернет функция tweak() и чему будет равно после ее выполнения значение переменной aNumber? На первый взгляд, все очевидно. При вызове функции tweak() уже существует глобальная переменная aNumber со значением 100. Функция создает локальную переменную newThing и присваивает ей значение 100 (значение глобальной переменной aNumber в момент вызова функции). После чего значение глобальной переменной aNumber меняется на 42. Выражение условия оператора if равно true и локальной переменной aNumber присваивается значение 123, которое в следующем операторе присваивается локальной переменной newThing и возвращается функцией tweak(). Итак, ответ таков: функция tweak() вернет значение 123, а после ее выполнение значение переменной aNumber будет равно 42. Выполним этот сценарий в браузере. Результат удивит нас весьма. Функция tweak() вернет значение undefined, а переменная aNumber как имела значение 100 до выполнения функции tweak(), так и будет его иметь! Почему? Пытаясь смоделировать выполнение программы, мы забыли, что интерпретатор до начала ее выполнения создает переменные, объявленные во всех операторах var, включая локальные переменные функций, и присваивая им значение undefined. Поэтому при входе в функцию tweak() доступа к глобальной переменной aNumber уже не будет, и первый оператор присваивания значения переменной newThing присвоит ей значение undefined. Теперь ясно, что блок оператора if выполняться не будет, и функция вернет значение undefined. По этой же причине не изменится и значение глобальной переменной aNumber, так как на самом деле значение 42 присваивается локальной переменной aNumber.
|