WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!

Pages:     | 1 | 2 || 4 | 5 |   ...   | 10 |

«тм Ричард Вагнер, Вайк Исчерпывающее руководство об основном языке сценариев Своевременные для создания полнофункциональных Web-приложений Объектно-ориентированная Исследуется связь JavaScript с другими ...»

-- [ Страница 3 ] --

мо многократно (или даже неограниченное количество При вызове функции можно передать значения, на раз) использовать отдельные части сценария, при этом зываемые аргументами (arguments). Аргументы можно периодическое повторение одного и того же раздела использовать в качестве (variables) в пределах программы неизбежно. одного блока операторов. Как только данные присвое Перечисленные проблемы приводят к идее разбие- ны переменной, становится возможной обработка дан ния сценария на части, из которых каждая служила бы ных либо использование их в вычислениях.

одной конкретной цели. Каждая цель на шаг прибли Создание функций жала бы к успеху в процессе выполнения JavaScript сценария. Проверка достоверности введенных в HTML- приводится синтаксис объявления функции в форму данных — еще одна задача, которую сценарий JavaScript:

мог бы выполнять, пока посетитель работает с Web function.. { страницей.

Базовое подмножество языка JavaScript Часть Ключевое слово function используется для определе ния функции с именем которое служит в качестве идентификатора для набора операторов, заклю ченных в фигурные скобки. Имена аргументов, храня щих передаваемые в функцию значения, заключаются в Вызов функции круглые скобки и отделяются друг от друга запятыми.

С точки зрения программирования, аргументы пред- Листинг демонстрирует вызов функции defaultColors() ставляют собой переменные, которым можно присваи- из второго раздела сценария. Это пример вызова функ вать литеральные значения, другие переменные или ции без аргументов. После полной загрузки HTML-до объекты, передаваемые в функцию при вызове. Даже в кумента функция сохраняется в памяти и находится там случае полного отсутствия аргументов все равно необ- "в состоянии боевой готовности". Она не будет выпол ходимо после имени функции указывать пару круглых няться, пока главный раздел сценария не вызовет ее скобок, тем самым обозначая идентификатор как фун- следующим оператором:

кцию.

Операторы в теле функции выполняются при каж В этой точке программа сразу же переходит на пер дом вызове функции. Для повышения удобочитаемос вую строку функции После выполнения ти строки внутри блока операторов выравниваются.

трех строк программа возвращается назад к точке, в которой она покинула главный раздел, и продолжает Где объявлять функции работу там.

Таким образом получается такой же эффект, как и Теоретически функцию можно объявлять в любом ме при помещении всего кода функции непосредственно в сте в пределах раздела кумента fgcolor и bgcolor можно изменять без обнов ления или перезагрузки страницы в браузере.

Например, можно создать функцию, необходимость в ко торой возникает много раз в ходе выполнения программы;

однако при этом каждый раз при вызове функции требует ся изменять одно из значений внутри функции.

Когда функция вызывается как getBinary(x), она Один из способов решения упомянутой проблемы получает копию значения, хранящегося в переменной без задействования механизма аргументов связан с при х. Такой процесс называется передачей по значению менением глобальных переменных, которые могут из (passing by value). Значение присваивается anlnteger меняться как вне, так и внутри функции. Программа локальной переменной данной функции. В дальнейшем станет запутанной, если те же самые переменные будут эту переменную можно использовать в любом месте использоваться внутри более чем одной функции. Вы блока операторов как локальную. Как показано на рис.

годнее создать функцию с аргументом, принимающим 8.2, если anlnteger изменяет значение внутри функции, все необходимые значения. В листинге 8.2 показана это изменение не затрагивает значение переменной х, функция, которая пользуется преимуществом примене которая играет роль аргумента.

ния аргументов.

Листинг 8.2. Использование аргумента в JavaScript-функции.

' • 9 в двоичном 255 в двоичном и Значение переменной х все еще равно:

i++) { S 1 1) ( result = "1" + result;

shortResult = result } else { result = "0" + '• anlnteger = anlnteger 1;

РИСУНОК 8.2. по значению не оказывает влияния на I первоначальную Обратите внимание, что anlnteger объявлять с ис пользованием ключевого слова var не требуется.

JavaScript автоматически объявляет новую переменную при каждом вызове функции.

рошим стилем программирования, иногда возникает необходимость установки другого количества аргумен передается значение, например, Г-н Президент. Если аргумент функции равен null, переменная в привет ственном сообщении вообще не используется.

Функции Глава Листинг 8.4. Функция, принимающая один аргумент или не принимающая ни одного аргумента.

в функцию не перелается значение, результате отображения I I > — вызов вызов // Как показано на рис 8.4, ее использование приводит к отображению нежелательных данных. В зависимости возможности подробно описывают от конкретного браузера, нежелательные данные будут ся на сайте Netscape DevEdge по адресу developer.netscape.com.

отображаться как undefined или как пустой символ.

Еще один случай связан с передачей в функцию большего количества аргументов, чем было определено в объявлении. Дополнительные значения при этом не Первый вызов раз здравствуйте. Г-н теряются, а сохраняются в массиве arguments, который представляет собой свойство каждой функции. Все ар Второй "Добро пожаловать на наш Если в функцию передается в результате отображения переменной "userName" гументы, сохраненные в массиве, могут быть извлече ны в пределах тела функции. Например, первый аргу мент, переданный в функцию welcomeMessage, можно получить так:

= Элементы массивов JavaScript нумеруются, начиная с 0. Второй элемент в массиве будет иметь индекс 1 и т.д.

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

8.4. Результат аргументов.

= В листинге 8.5 демонстрируются все упомянутые В настоящее время JavaScript поддерживает операцию возможности, при этом в передается которая обеспечивает проверку, является ли переменное количество аргументов. В данном случае userName неопределенным или равным null. Это иде функция приобретает следующий способ проверки, но он не поддерживается в вид:

некоторых устаревших браузерах.

Базовое подмножество языка JavaScript Часть II [, [..

. - •. Обратите внимание, что в листинге 8.5 ситуация, "Еще раз здравствуйте. "Давненько не при которой неизвестно, однако дополнитель "Добро на наш хотите пи стать "Стать ные сообщения должны отображаться, все еще поддер и в живается. Переменной присвоено значение null для того, чтобы заполнить первый элемент в мас сиве аргументов так, чтобы сообщение не рассматрива лось в качестве имени пользователя. На рис. 8.5 пока зано, что со всего этого вышло.

СОВЕТ При коллективной разработке все сложные сценарии необходимо документировать, чтобы все, написанное РИСУНОК 8.5. Передача в функцию множества для лично вами, смогли понять и другие. Без простых и на отображения множества сообщений.

глядных комментариев чтение приложения отымет го раздо больше времени.

Листинг 8.5. В функцию можно передать переменное количество аргументов.

количество аргументов в Функции Глава функций. К сожалению, нет средства, которое убе Использование глобальных и регло бы сценарий от использования переменной локальных переменных внутри функций, поскольку переменная будет рас В главе 5 рассматривались отличия между локальными сматриваться как глобальная. Из-за невнимательно и глобальными переменными. Кроме того, было проде- сти разработчика это может привести к перезаписи монстрировано, что глобальная переменная может из- значений, хранящихся в переменных с одинаковы меняться в любом месте документа, в то время как ло- ми именами. Во избежание подобного рода проблем кальная — только в пределах функции, в которой она всегда следуйте приведенным выше указаниям.

объявлена. Выбрать подходящий тип переменной мож • Если требуется переменная, изменяющаяся в преде но, следуя приведенным ниже рекомендациям:

лах одной функции, но не нужная в другой функции, • Если предполагается, что значение переменной бу- передавайте ее в эту функцию в качестве аргумента.

дет использоваться и, возможно, изменяться в любой Тем самым создается копия переменной и ее значе части программы (как внутри, так и вне функций), ние присваивается переменной аргумента заданной то переменная должна быть объявлена вне любой функции. Поскольку функция в процессе работы функции. Это называется созданием глобальной пе- изменяет свою собственную копию переменной, это поддающейся изменению в любой части никак не скажется на оригинале. Переменные аргу программы. Лучше всего объявлять глобальную пе- мента автоматически объявляются как локальные для ременную в разделе HTML-документа, тем данной функции. Даже если переменная аргумента самым обеспечивая объявление переменной до лю- имеет то же самое имя, что и передаваемая перемен бого ее использования. В этом случае исчезает необ- ная, изменения последнюю не затрагивают. Одно ходимость повторного объявления этой переменной исключение все же есть — объекты. Когда в каче внутри какой-либо функции. стве аргумента передается объект, он передается по ссылке, а не по значению. Вместо создания копии • Если переменная необходима только в пределах кон объекта функция использует объект.

кретной функции, там ее лучше и объявлять.

Изменения, сделанные в свойствах объекта в преде что при объявлении переменной используется лах функции, оказывают влияние на первоначальный ключевое слово var. В этом случае ее значение гаран объект.

будет изменятся только в пределах функ ции, JavaScript будет считать такую переменную Примеры передачи переменных по значению приведе уникальной и отличной от любых глобальных пере ны в листинге 8.6. Обратите внимание, как JavaScript раз менных, которые могут иметь то же самое имя. Для личает переменные с одинаковыми именами. Здесь пере объявления переменных аргументов использовать менная numberB передается в функцию ключевое слово var не требуется. Переменные, опре JavaScript автоматически создает локальную переменную, деленные в объявлении автоматически счи также названную numberB. Даже при том, что эта локаль таются локальными и объявленными с ключевым ная переменная имеет имя, совпадающее с глобальной, словом var.

изменения ее значения никак не затрагивают глобальную • Если требуется использовать переменную только в переменную. Результаты выполнения кода из этого ли главного сценария, а не внутри каких-либо стинга показаны на рис. 8.6.

функций, объявляйте переменную где-нибудь вне Листинг 8.6. Использование локальных и глобальных переменных.

и глобальные ной. Любые изменения, произведенные в копии, ори гинал не затрагивают.

С другой стороны, когда в функцию передается то передача происходит по ссылке. Следователь Начальное numberA: 1 numberA: 2 Начальное значение numberB: 1 значение numberB: 1 но, функция будет изменять первоначальный вид объек та. Зная это, простые типы данных можно поместить внутрь объекта, если требуется передать переменную по ссылке (см. листинг 8.7).

Листинг 8.7. Передача по ссылке по значению.

по ссылке по РИСУНОК 8.7. Передача пользовательского объекта JavaScript по ссылке.

В отличие от циклов, которые повторяются много start раз в определенной последовательности, функцию мож но повторно использовать в любое время, просто обраща ясь к ее имени. Создание функций, которые предназна чены для одной цели, но полезны в многих ситуациях, - практичный и предусмотрительный подход.

Функция intObject() используется для помещения Например, в листинге 8.4 функция переменной i в объектную оболочку. Экземпляр объек служит одной и той же цели сразу в нескольких слу та создается следующим образом:

чаях процессе выполнения программы. Функция var mylntObject = new welcomeMessage() пригодилась в большем количестве ситуаций, т.к. в листинге 8.5 был создан более гибкий Теперь mylntObject может использоваться для обра список аргументов. Она еще служит все той же цели, но щения к переменной i при помощи такого кода:

это лучший кандидат на повторное использование в более гибкой форме.

Вспомним, что функции можно хранить во внешних Это также позволяет передавать в функцию числовое JavaScript-файлах. Включают эти файлы, используя ат значение по ссылке. Функция modify() демонстрирует рибут src дескриптора Доступ к свойствам и методам объекта в JavaScript осу ществляется в соответствие с точечной нотацией. Эта запись, показанная в следующем синтаксическом при переменную this. В объявлении типа объекта (класса) переменная this ссылается на сам объект. Этот объект (текущий объект) является объектом, для которого При помощи следующего оператора в разделе объявляется метод.

документа создается и инициализируется в соответствии В типе объекта, определяющего комплексные числа, с текущим системным временем новый объект myClock метод сложения двух комплексных чисел записывается типа Clock:

следующим образом:

var myClock = new // х и у и выдать function var ПРИМЕЧАНИЕ var var JavaScript — это основанный на экзем плярах, в нем имеется возможность расширения лю a = + бого существующего объекта новыми свойствами и ме b = тодами во время выполнения. При этом новые rz = new Complex b) возможности добавляются только в один определен return ный объект и не затрагивают другие объекты того же типа.

Базовое подмножество языка JavaScript Часть II Оператор, вычисляющий сумму чисел х и у записы Отношения содержания в JavaScript вается так:

Отношения содержания — важный для понимания тер мин. При разработке JavaScript-сценариев и прикладных В методе add конструкция указывает на свой программ необходимо не только понимать, как один ство real текущего объекта х, в данном случае — x.real.

объект соотносится с другим, но и (для практических Точно так же указывает на свойство объек целей) знать, каким образом ссылаться на объект. Как та x.img, которое хранит мнимую часть х.

упоминалось ранее в главе (при обсуждении точечной нотации), при ссылке на свойства или методы объекта Исследование объектной модели JavaScript точка используется для обозначения принадлежности.

— действительно объекты, в том Например, в следующей примере метод write принад что они имеют свойства и методы и могут отве- лежит объекту Document:

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

программирования, такими как Java, C++ или Delphi, = то это самое значительное уточнение, о котором необ document — заданное по умолчанию имя объекта ходимо постоянно помнить при разработке программ на Document, a formMain — имя объекта Form, который JavaScript.

содержит кнопку okButton.

Принцип отношения содержания заклю При работе с объектами важно знать, когда есть не чается в том, что один объект содержит объекты.

обходимость в ссылке на содержащий объект и когда На рис. 9.9 отношения между объектом Form и объек такой необходимости нет. Например, объект Window том Radio не являются отношениями предка и потомка по существу, объект самого высокого уровня, с которым (или класса и подкласса), это отношения контейнера (со можно работать со стороны клиента. Большинство ссы держащего) и содержимого. Иначе говоря, между этими лок на объекты выполняются в пределах их отношений объектами нет родственных связей, поскольку ни один содержания. Предыдущий пример document.write мож из них не наследуется от другого. В результате один но записать и по-другому:

объект не может наследовать свойства и методы друго го, поэтому в такой иерархии нельзя разбить объекты на небу плавно летел подклассы.

Хотя в случаев ссылку на window мож но проигнорировать, она станет необходимой при работе со множеством окон или фреймов. Например, в листинге - ;

9.3 создается объект Window в функции showStats(), за - - тем этот объект разрушается в функции closeWindow().

!

Листинг 9.3. Создание нового окна и запись в него checkbox информации. _ hidden РИСУНОК 9.9.

встроенных JavaScript-объектов.

// сложить х и у и получить rz

function Поисковая форма var

var
var a = + (z) Объекты со стороны клиента Глава мер, в JavaScript можно создать кнопку, генерирующую событие onClick в результате щелчка на ней:

Простой поиск

Метод эмуляции события не генерирует событие, объяв ленное в другом месте для объекта. Если с событием необходимо связать определенное действие, обрабаты вать такое событие придется явно.

Поскольку обработчики событий разрешены только для все недавно созданные объек тные типы обработчиков событий не имеют. Более под робную информацию по событиям и обработчикам со бытий в JavaScript можно найти в главе 14.

( Простой Дополнительная информация об объектах При детальном рассмотрении полной иерархии объек тов JavaScript несложно заметить, что большинство объектов являются либо объектами со стороны клиента, либо со стороны сервера, либо же базовыми. В этом раз деле книги описаны объекты со стороны клиента и пред ставлены свойства и методы для каждого из них. Главы РИСУНОК 9.10. Графический пользовательский интерфейс.

10 и 12 посвящены другим типам объектов JavaScript.

В контексте GUI событие — это результат определен ПРИМЕЧАНИЕ ных пользовательских действий. Событие генерируется В дополнение к упомянутым трем типам объектов тогда, когда пользователь совершает действие. Напри Microsoft предлагает и ряд собственных языковых рас мер, когда пользователь щелкает на кнопке интерфей ширений для Windows Host. Эти расширения са, генерируется событие click. К другим событиям GUI дают возможность пользователям организовывать до относятся: щелчок на флажке, выбор строки из списка, ступ к файлам, перемещать папки и открывать при двойной щелчок на элементе, открытие или закрытие ложения практически так же, как и пакетные файлы (но эти средства мощнее). Расширения Microsoft в окна.

книге не рассматриваются.

Наилучший способ управления реализуется с использованием программирования, управляемого собы События могут перехватываться (captured) и об- Встроенные в JavaScrip функциональные возможно рабатываться обработчиками событий JavaScript. Допол- сти со стороны клиента всецело зависят от действий, информация может быть найдена в главе 14. выполнение которых обеспечивают HTML-страницы.

В общем случае, события не рассматриваются как Первый набор объектов вообще зависит от вида браузе особенности, относящиеся к ООП, хотя некоторые ра и HTML-дескрипторов в нем. На рис. показан языки программирования исходный текст HTML для некоторой Web-страницы с также события. Большинство элементов помеченными при помощи стрелок объектами JavaScript.

(экна, кнопки, текстовые поля, флажки) реагиру- Как видно из рисунка, большинство объектов ют на определенные события. Эти элементы существу- JavaScript — объектные представления дескрипторов ют в JavaScript как встроенные объектные типы. Напри- HTML. В табл. приводится список объектов со сто Базовое подмножество языка JavaScript Часть II клиента и с им дескрипторов Соответствующий JavaScript-объект HTML. HTML-дескриптор Document Fo Li Frame Document Laver or | Link i tte a Hat Plugin Form

Submit < input Text 1 I