Область видимости переменных
Любая переменная, объявленная вне тела функции оператором 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?
var aNumber = 100;function tweak() { var newThing = 0; newThing = aNumber; aNumber = 42; if (newThing == 100){ var aNumber; aNumber = 123; newThing = aNumber; } return newThing}tweak();На первый взгляд, все очевидно. При вызове функции 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.
Упражнения
1. Разработать функцию пересчета давления из мм рт. ст. в Па и наоборот (760 мм рт. ст. соответствует 101325 Па) со следующей спецификацией: pressure(value, code), где value — значение либо в мм рт. ст., либо в Па, а code — код пересчета (0 из мм рт. ст. в Па, 1 из Па в мм рт. ст.). При щелчке пользователем на кнопке страницы ему предлагается в диалоговых окнах функции prompt() ввести код пересчета, начальное и конечное значения пересчитываемых величин и шаг. Сценарий должен отобразить на странице таблицу пересчета.
2. Разработать функцию вычисления среднего арифметического чисел, вводимых пользователем в диалоговых окнах функции prompt(), и отобразить в диалоговом окне функции alert() сами числа и их среднее арифметическое. Вызов сценария осуществить при щелчке на кнопке.
3. Разработать сценарий с двумя функциями, отображающими диалоговое окно alert() с сообщением, что вызвана такая-то функция, который также подсчитывает количество вызовов каждой функции. На странице предусмотреть две кнопки для вызова двух функций, а также две кнопки для отображения количества вызовов соответствующих функций.
Урок 7. Встроенные объекты (1)
Язык JavaScript является объектно-ориентированным языком. Однако его объектная модель отличается от общеизвестных моделей таких языков программирования как Java и C++ тем, что в нем используется модель прототипов, а не классов. В языке JavaScript нет механизма классов, все объекты создаются на основе прототипа. Поэтому объектная модель JavaScript проще, но в связи с этим она и не столь мощна, как модели, основанные на классах. Здесь вы не найдете ни наследования, ни полиморфизма. В этом и следующем уроках мы остановимся на создании и работе со встроенными в JavaScript объектами, а в последнем уроке, завершающим часть I нашего курса, мы научим читателя создавать собственные пользовательские объекты.
Объект Array
Массив – упорядоченный набор однородных данных, к элементам которого можно обращаться по имени и индексу. В JavaScript, так как в нем отсутствует определение переменных определенного типа, это определение расширяется до хранения не обязательно однородных данных.
Любой объект в JavaScript создается конструктором этого объекта — специальной функцией, в которой определяются свойства и методы объекта. Для встроенных объектов конструкторы реализованы в виде функций, написанных на низкоуровневом языке процессора и встроенных в язык JavaScript. Для создания объекта необходимо выполнить операцию new с единственным операндом — конструктором этого объекта. Результатом выполнения этой операции будет выделение области оперативной памяти для хранения объекта, его инициализация и возврат ссылки на выделенную область памяти, которую можно сохранить в переменной для последующего обращения к объекту.. Все сказанное относится и к создаваемым пользователем объектам, но конструктор пишется на языке JavaScript с применением специальных правил создания свойств и методов объекта.
Массив, как и любой объект, создается с помощью операции new и своего конструктора — функции Array. Как и в других объектно-ориентированных языках, у объекта определенного типа может быть несколько конструкторов, отличающихся друг от друга только передаваемыми в него параметрами (имя всегда остается одно и то же):
a = new Array() // пустой массив (количество элементов 0)
a = new Array(число) // массив с заданным числом элементов
a = new Array(элемент0, элемент1, . . . , элементN);
Количество элементов может быть равно максимальному значению 4-х байтного числа без знака.
Для получения значения элемента массива следует в квадратных скобках рядом с именем массива указать порядковый номер элемента (выполнить операцию индексацию []):
a[0] = "1"; a[1] = 2;
c = b[2]*c[3];
Нумерация элементов массива начинается с 0. При попытке получить значение элемента массива с несуществующим индексом никакой ошибки генерироваться не будет, а всегда будет возвращено значение undefined.
Дата добавления: 2018-09-24; просмотров: 309;