Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Предположим, что была определена функция f, которая требует один аргумент, х. Если вызвать эту функцию с двумя аргументами, то первый будет доступен внутри функции по имени параметра х или как arguments[0].
Второй аргумент будет доступен только как arguments[1].
Кроме того, подобно настоящим массивам, arguments
имеет свойство length
, определяющее количество содержащихся элементов. То есть в теле функции f, вызываемой с двумя аргументами, arguments, length
имеет значение 2.
Объект Arguments
может использоваться с самыми разными целями. Следующий пример показывает, как с его помощью проверить, была ли функция вызвана с правильным числом аргументов, - ведь JavaScript этого за вас не сделает:
function f(x, у, z)
{
// Сначала проверяется, правильное ли количество аргументов передано
if (arguments.length != 3) {
throw new Error("функция f вызвана c ” + arguments.length +
"аргументами, а требуется 3.");
}
// А теперь сам код функции...
}
Обратите внимание, что зачастую нет необходимости проверять количество аргументов, как в данном примере. Поведение по умолчанию интерпретатора JavaScript отлично подходит для большинства случаев: отсутствующие аргументы замещаются значением undefined
, а лишние аргументы просто игнорируются.
Объект Arguments
иллюстрирует важную возможность JavaScript-функций: они могут быть написаны таким образом, чтобы работать с любым количеством аргументов. Следующая функция принимает любое число аргументов и возвращает значение самого большого из них (аналогично ведет себя встроенная функция Math.max()):
function max(/*...*/)
{
var m = Number.NEGATIVE.INFINITY;
// Цикл по всем аргументам, поиск и сохранение наибольшего из них
for(var і = 0; і < arguments.length; i++)
if (arguments[i] > max) max = arguments[i];
// Вернуть наибольшее значение return max;
}
var largest = max(1, 10, 100, 2, 3, 1000, 4, 5, 10000, 6); // => 10000
Функции, подобные этой и способные принимать произвольное число аргументов, называются функциями с переменным числом аргументов (ivariadic functions, variable arity functions или varargs functions). Этот термин возник вместе с появлением языка программирования С.
Обратите внимание, что функции с переменным числом аргументов не должны допускать возможность вызова с пустым списком аргументов. Будет вполне разумным использовать объект arguments[]
при написании функции, ожидающей получить фиксированное число обязательных именованных аргументов, за которыми может следовать произвольное число необязательных неименованных аргументов.
Не следует забывать, что arguments
фактически не является массивом - это объект Arguments
. В каждом объекте Arguments
имеются пронумерованные элементы массива и свойство length
, но с технической точки зрения это не массив. Лучше рассматривать его как объект, имеющий некоторые пронумерованные свойства. Подробнее об объектах, подобных массивам, рассказывается в разделе 7.11.
У объекта Arguments
есть одна очень необычная особенность. Когда у функции имеются именованные параметры, элементы массива объекта Arguments
при выполнении в нестрогом режиме являются синонимами параметров, содержащих аргументы функции. Массив arguments[]
и имена параметров - это два разных средства обращения к одним и тем же переменным. Изменение значения аргумента через имя аргумента меняет значение, извлекаемое через массив arguments[]
. Изменение значения аргумента через массив arguments[]
меняет значение, извлекаемое по имени аргумента. Например:
function f(x) {
console.log(x); // Выведет начальное значение аргумента
arguments[0] = null; // При изменении элемента массива изменяется х!
console.log(x); // Теперь выведет "null"
}
Определенно, это не совсем то поведение, которое можно было бы ожидать от настоящего массива. В этом случае arguments[0]
и х могли бы ссылаться на одно и то же значение, но изменение одной ссылки не должно оказывать влияния на другую.
Эта особенность в поведении объекта Arguments
была ликвидирована в строгом режиме, предусматриваемом стандартом ECMAScript 5. Кроме того, в строгом режиме имеется еще несколько отличий. В нестрогом режиме arguments
- это всего лишь обычный JavaScript-идентификатор, а не зарезервированное слово. В строгом режиме не допускается использовать имя arguments
в качестве имени параметра или локальной переменной функции и отсутствует возможность присваивать значения элементам arguments.
8.3.2.1. Свойства callee и caller
Помимо элементов своего массива объект Arguments
определяет свойства callee
и caller
. При попытке изменить значения этих свойств в строгом режиме ECMAScript 5 гарантированно возбуждается исключение ТуреЕrror
. Однако в нестрогом режиме стандарт ECMAScript утверждает, что свойство callee
ссылается на выполняемую в данный момент функцию. Свойство caller
не является стандартным, но оно присутствует во многих реализациях и ссылается на функцию, вызвавшую текущую. Свойство caller
можно использовать для доступа к стеку вызовов, а свойство callee
особенно удобно использовать для рекурсивного вызова неименованных функций:
var factorial = function(x) {
if (x <= 1) return 1; return x * arguments.callee(x-1);
};
8.3.3. Использование свойств объекта в качестве аргументов
Когда функция имеет более трех параметров, становится трудно запоминать правильный порядок их следования. Чтобы предотвратить ошибки и избавить программиста от необходимости заглядывать в документацию всякий раз, когда он намеревается вставить в программу вызов такой функции, можно предусмотреть возможность передачи аргументов в виде пар имя/значение в произвольном порядке. Чтобы реализовать такую возможность, при определении функции следует предусмотреть передачу объекта в качестве единственного аргумента. Благодаря такому стилю пользователи функции смогут передавать функции объект, в котором будут определяться необходимые пары имя/значение. В следующем фрагменте приводится пример такой функции, а также демонстрируется возможность определения значений по умолчанию для опущенных аргументов:
Читать дальшеИнтервал:
Закладка: