JavaScript. Подробное руководство, 6-е издание, стр. 92
8.3.2.1. Свойства callee и caller
Помимо элементов своего массива объект
<b>Arguments</b><b>callee</b><b>caller</b><b>ТуреЕrror</b><b>callee</b><b>caller</b><b>caller</b><b>callee</b><b>var factorial = function(x) { </b><b> if (x <= 1) return 1; return x * arguments.callee(x-1);</b><b>};</b>8.3.3. Использование свойств объекта в качестве аргументов
Когда функция имеет более трех параметров, становится трудно запоминать правильный порядок их следования. Чтобы предотвратить ошибки и избавить программиста от необходимости заглядывать в документацию всякий раз, когда он намеревается вставить в программу вызов такой функции, можно предусмотреть возможность передачи аргументов в виде пар имя/значение в произвольном порядке. Чтобы реализовать такую возможность, при определении функции следует предусмотреть передачу объекта в качестве единственного аргумента. Благодаря такому стилю пользователи функции смогут передавать функции объект, в котором будут определяться необходимые пары имя/значение. В следующем фрагменте приводится пример такой функции, а также демонстрируется возможность определения значений по умолчанию для опущенных аргументов:
<b>// Скопировать length элементов из массива from в массив to.</b><b>// Копирование начинается с элемента from_start в массиве from</b><b>// и выполняется в элементы, начиная с to_start в массиве to.</b><b>// Запомнить порядок следования аргументов такой функции довольно сложно.</b><b>function аггаусору(/* массив */ from, /* индекс */ from_start,</b><b> /* массив */ to, /* индекс */ to_start,</b><b> /* целое */ length)</b><b>{</b><b> // здесь находится реализация функции</b><b>}</b><b>// Эта версия функции чуть менее эффективная, но не требует запоминать порядок следования</b><b>// аргументов, а аргументы from_start и to_start по умолчанию принимают значение 0.</b><b>function easycopy(args) {</b><b> arraycopy(args.from,</b><b> args.from_start || 0,</b><b> // Обратите внимание, как назначаются args.to,</b><b> // значения по умолчанию</b><b> args.to_start || 0, args.length);</b><b>}</b><b>// Далее следует пример вызова функции easycopy():</b><b>var а = [1,2,3,4], b = [];</b><b>easycopy({from: a, to: b, length: 4});</b>8.3.4. Типы аргументов
В языке JavaScript параметры функций объявляются без указания их типов, а во время передачи значений функциям не производится никакой проверки их типов. Вы можете сделать свой программный код самодокументируемым, выбирая описательные имена для параметров функций и включая описание типов аргументов в комментарии, как это сделано в только что рассмотренном примере функции аггаусору(). Для необязательных аргументов в комментарий можно добавлять слово «необязательный» («optional»). А если функция может принимать произвольное число аргументов, можно использовать многоточие:
<b>function max(/* число... */) { /* тело функции */ }</b>Как отмечалось в разделе 3.8, при необходимости JavaScript выполняет преобразование типов. Таким образом, если определить функцию, которая ожидает получить строковый аргумент, а затем вызвать ее с аргументом какого-нибудь другого типа, значение аргумента просто будет преобразовано в строку, когда функция пытается обратиться к нему как к строке. В строку может быть преобразовано любое простое значение, и все объекты имеют методы
<b>toString()</b>Однако такой подход может использоваться не всегда. Вернемся к методу
<b>аггаусору()</b><b>// Возвращает сумму элементов массива (или объекта, подобного массиву) а.</b><b>// Все элементы массива должны быть числовыми, при этом значения null</b><b>// и undefined игнорируются,</b><b>function sum(a) {</b><b> if (isArrayLike(a)) {</b><b> var total = 0;</b><b> for(var і = 0; і < a.length; і++) { // Цикл по всем элементам</b><b> var element = a[і];</b>