HTML, XHTML и CSS на 100%
Шрифт:
var arg1=arguments[0];
Таким образом, аргументы индексируются, начиная с нуля. Для определения общего количества аргументов, переданных функции, можно использовать свойство length объекта arguments.
Листинг 11.21 демонстрирует возможность обработки переменного количества аргументов.
<html>
<head>
<title>Пример переменного количества аргументов в функции</title>
<script>
function sum(x1,x2) //Функция
{
var s=0; //Начальное значение суммы
//Цикл по всем аргументам
for (var i=0;i<arguments.length;i++)
{
s+=arguments[i];
}
return (s);
}
</script>
</head>
<body>
<script>
//Вызываем функцию
alert (sum(1,2,3,4));
alert (sum(1,-3,40,2,5,7));
</script>
</body>
</html>
Аргументами функции могут выступать не только данные простого типа, но и объекты. Однако при передаче функции строки, числа или логической величины в функции создается копия переданного значения и оригинал не изменяется, то есть что бы ни делали с аргументом внутри функции, после завершения функции эта переменная уничтожается, а оригинальная переменная остается прежней. Иначе происходит при передаче объекта. В этом случае копия объекта не создается, а передается ссылка на данный объект. Если бы происходило иначе, то терялось бы много времени и памяти на создание дубликатов. Представьте, сколько потребовалось бы времени на передачу массива из 10 000 элементов, когда фактически можно обойтись передачей одного значения – ссылки на этот массив. Однако программист должен помнить, что работает в функции с оригинальным объектом.
Функции могут быть рекурсивными, то есть прямо или косвенно вызывать сами себя. Если в теле функции явно используется вызов этой же функции, то имеет место прямая рекурсия. Если же функция содержит обращение к другой функции, содержащей прямой или косвенный вызов первой функции, то данная функция является косвенно рекурсивной. Классический пример – функция для вычисления факториала неотрицательного целого числа (листинг 11.22).
<html>
<head>
<title>Пример рекурсивной функции </title>
<script>
function fact(n)
{
if (n<0) return(null); //Проверка на отрицательные числа
if (n==0) return (1); //Проверка на 0
return (n*fact(–n));//Рекурсивный вызов
}
</script>
</head>
<body>
<script>
var x=prompt("Введите число","5");
x=+x;
//Вызываем функцию
alert (x+"!="+fact(x));
</script>
</body>
</html>
Для отрицательного числа
Рис. 11.16. Пример рекурсивной функции
Знакомство с событиями
Очень часто язык JavaScript применяется для реагирования на события, которые могут быть вызваны пользователем или браузером. К событиям относятся открытие новой страницы, перемещение указателя мыши, щелчок кнопкой мыши и т. д. Каждое событие имеет соответствующий обработчик, который автоматически реагирует на возникшее событие.
Так, событие onLoad происходит после загрузки какого-либо элемента, например веб-страницы. Использование обработчика этого события позволяет выполнять JavaScript-код сразу после полной загрузки документа.
Одним из часто используемых событий является щелчок кнопкой мыши на объекте. При его возникновении обработчик события onClick объекта выполняет код JavaScript (листинг 11.23).
<html>
<head>
<title>Пример обработчиков событий</title>
<script>
function mes
{
alert ("Замечательная ссылка");
}
</script>
</head>
<body>
<h2>Пример обработчиков событий</h2>
<a href=http://www.myserver.ru/page1.html onClick="mes">Ссылка 1</a>
<br>
<a href=http://www.myserver.ru/page2.html
onClick="alert('Еще одна ссылка')">Ссылка 1
</a>
</body>
</html>
Из данного кода видно, что обработчик события может быть вызовом функции. Однако может и непосредственно указываться JavaScript-код. В данном случае оба обработчика вызывают метод alert (рис. 11.17).
Рис. 11.17. Пример обработчиков событий
11.6. Встроенные объекты JavaScript
Объекты JavaScript объединяют в себе переменные, именуемые свойствами, и функции, управляющие этими свойствами, именуемые методами. Кроме того, они могут реагировать на события. Пользователь может создавать свои объекты, но JavaScript содержит ряд базовых объектов.
• Global – набор высокоуровневых свойств и методов, у которых нет родительского объекта.