Функции в JavaScript могут содержать произвольное число параметров. Для всех используется одно и то же описание.
Перегрузки функций нет, повторное объявление функции замещает предыдущее. Обработка выполнения в зависимости от количества и типа полученных аргументов должна происходить внутри функции.
Объект arguments (это объект, а не массив, его ключи - числовые ключи объекта, а не индексы массива) содержит все аргументы, реально полученные функцией. Этот объект доступен только из самой функции и создается вместе с ней. В том случае, когда число параметров неизвестно или может меняться, а функция проводит над параметрами однотипные действия, удобнее всего использовать его вместо объявления параметров в заголовке.
function sum() {
var i, s = 0;
for (i = 0; i < arguments['length']; i += 1) {
s += arguments[i];
}
return s;
};
Каждая
функция имеет встроенный метод apply. Обычно он используется для вызова
функции в контексте некоторого объекта и, в отличие от аналогичного
метода call, позволяет передавать аргументы функции в виде массива.
Альтернативное применение метода - применение функции с переменным
числом аргументов к массиву, который, может возвращать некоторая другая
функция. В этом случае в качестве первого аргумента apply используется
null:
function getRandoms(n) {
var a, i;
for (i = 0; i < n; i += 1) {
a[i] = Math.random();
}
return a;
}
var s = sum.apply(null, getRandoms(10));
Если получено меньше аргументов, чем объявлено, все недополученные аргументы инициализируются значением undefined.
Если получено аргументов больше, чем объявлено, "лишние" аргументы можно получить из объекта-псевдомассива arguments.
arguments является именно объектом, свойства которого имеют числовые имена. Благодаря синтаксису JS мы можем обращаться к свойствам объекта в стиле обращения к элементам массива: arguments[0] вместо arguments['0'] (для массивов работает и обратное правило). Для работы с объектом arguments как с настоящим массивом со всеми применимыми к массиву методами можно использовать следующую конструкцию:
var args = [].slice.call(arguments);
var args = Array.prototype.slice.call(arguments); // быстрее
arguments является именно объектом, свойства которого имеют числовые имена. Благодаря синтаксису JS мы можем обращаться к свойствам объекта в стиле обращения к элементам массива: arguments[0] вместо arguments['0'] (для массивов работает и обратное правило). Для работы с объектом arguments как с настоящим массивом со всеми применимыми к массиву методами можно использовать следующую конструкцию:
var args = [].slice.call(arguments);
var args = Array.prototype.slice.call(arguments); // быстрее
Функция как объект имеет свойство length, содержащая число параметров, имеющихся в объявлении функции. А объект arguments также имеет свойство length, который содержит число параметров реально переданных функции.
function f() {
function f() {
console.log(arguments.length);
}
f(1, 2, 3); // > 3
console.log(f.length); // > 0
Для вариативных функций, позволяющих вызов без параметров, и использующих только объект arguments, f.length() будет возвращать 0, несмотря на способность принимать любое количество параметров.
Важно! Т.к. arguments является только псевдомассивом, его свойство length не обновляется при удалении свойств arguments.
(function(a, b, c) { delete arguments[0]; return arguments.length; })(1, 2, 3); // > 3
В strict mode arguments содержит копию всех значений объявленных параметров. Изменяя его свойства мы не изменяем параметры из заголовка функции. В обычном режиме arguments и объявленные параметры связаны (параметры являются псевдонимами соответствующих значений arguments):
function f(param) {
arguments[0] = 10;
console.log(param);
}
f(5); // > 10
function f(param) {
"strict mode";
argumetns[0] = 10;
console.log(param);
}
f(5); // > 5
Для определения имени функции, которая в данный момент вызвана, можно использовать свойство arguments.callee. Для определения имени функции, которая вызвала данную функцию, свойство arguments.callee.caller. Оба эти свойства не рекомендуются к использованию и недоступны в strict mode.
В том случае, если определение функции содержит много аргументов, можно перепутать порядок их вызова при использовании функции. Кроме того, ряд аргументов может быть опциональным (для этого обычно используют значение null), поэтому при вызове для всех таких аргументов нужно проставить null. Чтобы избежать этого, функции можно передать объект, содержащий в качестве свойств только те аргументы, с которыми реально нужно запустить функцию.
Допустим, объявлена функция:
function f(foo, bar, param1, param2) {};
Вместо вызова:
f(100, null, "value1)
можно объявить ее иначе:
function f(args) {
var foo = args.foo || 200; // инициализация значениями по
var bar = args.bar || 350; // умолчанию вместо undefined
var param1 = args.param1 || "string1";
var param2 = args.param2 || "string2";
}
и использовать вызов:
f({ foo: 100, param1: "value1" });
или же
var opts = { foo: 100, param1: "value" };
f(opts);
Использование объекта в качестве аргумента функции эквивалентно технике именованных аргументов (именованных параметров) других языков.
В том случае, если определение функции содержит много аргументов, можно перепутать порядок их вызова при использовании функции. Кроме того, ряд аргументов может быть опциональным (для этого обычно используют значение null), поэтому при вызове для всех таких аргументов нужно проставить null. Чтобы избежать этого, функции можно передать объект, содержащий в качестве свойств только те аргументы, с которыми реально нужно запустить функцию.
Допустим, объявлена функция:
function f(foo, bar, param1, param2) {};
Вместо вызова:
f(100, null, "value1)
можно объявить ее иначе:
function f(args) {
var foo = args.foo || 200; // инициализация значениями по
var bar = args.bar || 350; // умолчанию вместо undefined
var param1 = args.param1 || "string1";
var param2 = args.param2 || "string2";
}
и использовать вызов:
f({ foo: 100, param1: "value1" });
или же
var opts = { foo: 100, param1: "value" };
f(opts);
Использование объекта в качестве аргумента функции эквивалентно технике именованных аргументов (именованных параметров) других языков.
Комментариев нет :
Отправить комментарий