points.dist // => 1.414: расстояние между 2-мя точками
Теперь, как было обещано, рассмотрим несколько функций, которые демонстрируют применение наиболее часто используемых управляющих инструкций JavaScript:
//
В JavaScript имеются условные инструкции и инструкции циклов, синтаксически
// похожие на аналогичные инструкции С, C++, Java и в других языках.
function abs(x) { // Функция, вычисляющая абсолютное значение
if (х >= 0) { // Инструкция if ...
return х; // выполняет этот код, если сравнение дает true.
} // Конец предложения if.
else { // Необязательное предложение else выполняет свой код,
return -x; // если сравнение дает значение false.
} // Фигурные скобки можно опустить, если предложение
// содержит 1 инструкцию.
} // Обратите внимание на инструкции return внутри if/else.
function factorial(n) { // Функция, вычисляющая факториал
var product = 1; // Начать с произведения, равного 1
while(n > 1) { // Повторять инструкции в {}, пока выраж. в истинно
function factorial2(n) { // Другая версия, использующая другой цикл
var і, product = 1; // Начать с 1
for(i=2; і <= n; i++) // і автоматически увеличивается с 2 до n
product *= i; // Выполнять в каждом цикле. {} можно опустить,
// если тело цикла состоит из 1 инструкции
return product; // Вернуть факториал
}
factorial2(5) // => 120: 1*2*3*4*5
JavaScript - объектно-ориентированный язык, но используемая в нем объектная модель в корне отличается от модели, используемой в большинстве других языков. В главе 9 «Классы и модули» детально рассматривается объектно-ориентированное программирование на языке JavaScript на большом количестве примеров; эта глава является одной из самых больших в книге. Ниже приводится очень простой
пример, демонстрирующий определение класса JavaScript для представления точек на плоскости. Объекты, являющиеся экземплярами этого класса, обладают единственным методом с методом r, который вычисляет расстояние между данной точкой и началом координат:
// Определение функции-конструктора для инициализации нового объекта Point
function Point(x,y) { // По соглашению имя конструкторов начинается с заглавного символа
this.x = x; // this - ссылка на инициализируемый объект
this.у = у; // Сохранить аргументы в свойствах объекта
} // Ничего возвращать не требуется
// Чтобы создать новый экземпляр, необходимо вызвать функцию-конструктор
// с ключевым словом "new"
var р = new Point(1, 1); // Точка на плоскости с координатами (1,1)
// Методы объектов Point определяются за счет присваивания функций свойствам
// объекта-прототипа, ассоциированного с функцией-конструктором.
Point.prototype.r = function {
return Math.sqrt( // Вернуть корень квадратный от x2 + y2
this.x * this.x + // this - это объект Point, относительно которого...
this.у * this.у // ...вызывается метод.
);
};
// Теперь объект p типа Point (и все последующие объекты Point) наследует метод r
p.r // => 1.414...
Глава 9 является кульминацией первой части, а главы, которые следуют за ней, связывают некоторые оборванные концы и завершают исследование базового языка. В главе 10 «Шаблоны и регулярные выражения» описывается грамматика регулярных выражений и демонстрируются приемы использования регулярных выражений для реализации сопоставления с текстовыми шаблонами. В главе 11 «Подмножества и расширения JavaScript» рассматриваются подмножества и расширения базового языка JavaScript. Наконец, прежде чем перейти к исследованию клиентского JavaScript в веб-броузерах, в главе 12 «Серверный JavaScript» будут представлены два способа использования JavaScript за пределами веб-броузеров.
1.2. Клиентский JavaScript
Изучение клиентского JavaScript представляет собой задачу, нелинейную из-за перекрестных ссылок в значительно меньшей мере, чем базовый язык, и поэтому вполне возможно изучать особенности использования JavaScript в веб-броузерах в линейном порядке. Возможно, вы взялись за чтение этой книги, чтобы изучить клиентский JavaScript - тему далекой второй части, поэтому здесь мы приводим краткий обзор основных приемов программирования клиентских сценариев, который сопровождается подробным примером.