Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Однако такой подход может использоваться не всегда. Вернемся к методу

аггаусору
, продемонстрированному выше. Он ожидает получить массив в первом аргументе. Любое обращение к функции окажется неудачным, если первым аргументом будет не массив (или, возможно, объект, подобный массиву). Если функция должна вызываться чаще, чем один-два раза, следует добавить в нее проверку соответствия типов аргументов. Гораздо лучше сразу же прервать вызов функции в случае передачи аргументов ошибочных типов, чем продолжать выполнение, которое потерпит неудачу с сообщением об ошибке, запутывающим ситуацию. Ниже приводится пример функции, выполняющей
проверку типов. Обратите внимание, что она использует функцию isArrayLike из раздела 7.11:

// Возвращает сумму элементов массива (или объекта, подобного массиву) а.

// Все элементы массива должны быть числовыми, при этом значения null

// и undefined игнорируются,

function sum(a) {

if (isArrayLike(a)) {

var total = 0;

for(var і = 0; і < a.length; і++) { // Цикл по всем элементам

var element = a[і];

if (element == null) continue; // Пропустить null и undefined

if (isFinite(element))

total += element;

else throw new Error("sum: все элементы должны быть числами");

}

return total;

}

else throw new Error("sum: аргумент должен быть массивом");

}

Этот метод

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

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

flexsum,
реализующий такой подход (и, вероятно, являющийся примером другой крайности). Например, он принимает любое число входных аргументов и рекурсивно обрабатывает те из них, которые являются массивами. Вследствие этого он может принимать переменное число аргументов или массив аргументов. Кроме того, он прилагает максимум усилий, чтобы преобразовать нечисловые аргументы в числа, прежде чем сгенерировать исключение:

function flexisum(a) { var total = 0;

for(var і = 0; і < arguments.length; i++) {

var element = arguments[i], n;

if (element == null) continue; //
Игнорировать null и undefined

if (isArray(element)) // Если аргумент - массив

n = flexisum.apply(this. element); // вычислить сумму рекурсивно

else

if (typeof element === "function") // Иначе, если это функция...

n = Number(element); // вызвать и преобразовать,

else

n = Number(element); // Иначе попробовать преобразовать

if (isNaN(n)) // Если не удалось преобразовать в число, возбудить искл.

throw Error("flexisum: невозможно преобразовать " + element + в число");

total += n; // Иначе прибавить n к total

}

return total;

}

8.4. Функции как данные

Самые важные особенности функций заключаются в том, что они могут определяться и вызываться. Определение и вызов функции - это синтаксические средства JavaScript и большинства других языков программирования. Однако в JavaScript функции - это не только синтаксические конструкции, но и данные, а это означает, что они могут присваиваться переменным, храниться в свойствах объектов или элементах массивов, передаваться как аргументы функциями и т. д. [13]

13

Это может показаться не столь интересным, если вы не знакомы с такими языками, как Java, в которых функции являются частью программы, но не могут управляться программой.

Чтобы понять, как функции в JavaScript могут быть одновременно синтаксическими конструкциями и данными, рассмотрим следующее определение функции:

function square(x) { return х*х; }

Это определение создает новый объект функции и присваивает его переменной square. Имя функции действительно нематериально - это просто имя переменной, которая ссылается на объект функции. Функция может быть присвоена другой переменной, и при этом работать так же, как и раньше:

var s = square; // Теперь s ссылается на ту же функцию, что и square

square(4); // => 16

s(4); // => 16

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

var о = {square: function(x) { return х*х; }}; // Литерал объекта

Поделиться:
Популярные книги

Повседневная жизнь в эпоху Жанны д'Арк

Дефурно Марселен
Живая история: Повседневная жизнь человечества
Научно-образовательная:
история
культурология
5.00
рейтинг книги
Повседневная жизнь в эпоху Жанны д'Арк

Том 3. Лица

Замятин Евгений Иванович
3. Собрание сочинений в пяти томах
Проза:
русская классическая проза
5.00
рейтинг книги
Том 3. Лица

История кавалерии. Вооружение, тактика, крупнейшие сражения

Денисон Джордж Тэйлор
Научно-образовательная:
история
cпецслужбы
военная история
5.00
рейтинг книги
История кавалерии. Вооружение, тактика, крупнейшие сражения

Ставрос. Падение Константинополя

MadameD
Проза:
историческая проза
5.00
рейтинг книги
Ставрос. Падение Константинополя

КУТУЗОВ

Раковский Леонтий Иосифович
5.00
рейтинг книги
КУТУЗОВ

Ксения

Зиминоид
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ксения

Поход

Валериев Игорь
4. Ермак
Фантастика:
боевая фантастика
альтернативная история
6.25
рейтинг книги
Поход

Гримуар темного лорда V

Грехов Тимофей
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.50
рейтинг книги
Гримуар темного лорда V

Техники ландшафтной арт-терапии

Копытин Александр Иванович
Научно-образовательная:
психотерапия и консультирование
5.00
рейтинг книги
Техники ландшафтной арт-терапии

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.25
рейтинг книги
Второгодка. Книга 3. Ученье свет

Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Троцкий Лев Давидович
Документальная литература:
публицистика
5.00
рейтинг книги
Советская республика и капиталистический мир. Часть I. Первоначальный период организации сил

Юлий Цезарь

Утченко Сергей Львович
Научно-образовательная:
история
6.80
рейтинг книги
Юлий Цезарь

Брат, мсти за любовь!

Колычев Владимир Григорьевич
2. Брат
Детективы:
боевики
6.00
рейтинг книги
Брат, мсти за любовь!

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9