Локальная переменная arguments
доступна внутри функций.
Вы можете обращаться к аргументу по номеру, начиная от 0. При этом arguments
содержит не объявленные, а реально переданные аргументы.
Следующий пример выведет реально переданные три аргумента, несмотря на то, что в функции их всего два.
function func(a,b) {
alert(arguments[0])
alert(arguments[1])
alert(arguments[2])
}
func(1,2,3)
Кроме цифровых индексов, у arguments
есть свойство length
, такое же как у массива.
Благодаря этому можно вызывать функции с переменным числом параметров. В следующем примере функция возвращает сумму всех аргументов.
Пример: сумма аргументов
function sum() {
var s = 0
for(var i=0; i<arguments.length; i++) s += arguments[i]
return s
}
Несмотря на доступ по индексу и наличие свойства length
, arguments
не является массивом, т.е не принадлежит типу Array.
Поэтому для arguments
нельзя напрямую вызвать методы этого класса:
arguments.pop() // ошибка !
Можно, однако, вызвать методы Array через apply/call:
var args = Array.prototype.slice.call(arguments)
Ссылка на функцию arguments.callee
Кроме аргументов, arguments
содержит ссылку на выполняющуюся функцию.
Ее можно использовать для задания и чтения статических свойств.
В следующем примере для этого используется статическое свойство called
.
Пример: подсчет количества выполнений
function func() {
arguments.callee.called++
}
func.called = 0;
func()
func()
alert(func.called) // 2
Я даже не знал о такой переменной...
Подскажите если я вот так использую функцию она может отжирать много оперативки?
Спасибо за статью, даже не слышал о такой переменной, и когда она мне попалась при разработке анимации на сайте, не мог найти достойного описании. А тут как свет с небес, все стало ясно. Спасибо огромное, и респект сайту, дай бог Вам долгого существования, таких бы сайтов да побольше и в одном месте а не рыться в поисковике.
Благодарю за подобное описание функции! Я именно ее и искал.
"arguments содержит не объявленные, а реально переданные аргументы"
Это значит, что можно и не описывать аргументы т.е. вот так?:
function func(){
console.log(arguments[0]);
}
func(1);
да
Почему то в описании функции массивов slice первый параметр обязателен, а в конструкции
функция slice вызывается без аргументов, и тем не менее возвращает массив, содержащий все переданные в функцию аргументы. Это нестыковка документации javascript?
или :
function func() {
func.called++
}
"Вы можете обращаться к аргументу по номеру, начиная от 0. При этом arguments содержит не объявленные, а реально переданные аргументы.
Следующий пример выведет реально переданные три аргумента, несмотря на то, что в функции их всего два."
"Определимся с терминами". При объявлении функции указываются ПАРАМЕТРЫ, а не аргументы.
Параметр - это то, что ОБЪЯВЛЯЕТСЯ, аргумент - что ПЕРЕДАЕТСЯ. Слово "реально" в контексте "реально переданные" второй фразы лишнее.
"arguments
Переменная, доступная внутри функции и содержащая аргументы и ссылку на саму функцию."
Первое. Если аргумент - это значение, которое задается при вызове функции (по определению), то переменная arguments, скорее, содержит параметры, а не аргументы.
Второе. Элементарный анализ показывает, что при описании функции, использующей переменные arguments, стоит опустить указание параметров, (так как их может быть любое количество от 0 до n+1, где n - максимальный номер переменной arguments).
Получается, что в js нет процедур, их роль выполняют функции. Если функция возвращает значение (то есть, содержит оператор return), которое можно присвоить переменной, вызвав данную функцию, то это – функция в чистом виде. Если же она возвращает действие (без return), то эта функция по сути (де факто) является процедурой.
Так вот, в функциях-процедурах наряду с ненулевым может иметь и нулевое количество параметров.
Спешу себя опровергнуть. Если в определении функции используется переменная arguments, то ее можно вызывать с ЛЮБЫМ количеством аргументов!
Спасибо, хорошее описание. Но один вопрос: немного не ясно по поводу arguments.callee. Для чего это надо? Именно конкретно arguments.callee. Заранее благодарю за помощь
Калли нужен судя по всему, для каких-нибудь особых случаев, когда ты не очевидным способом захочешь изменить свойства функции.
arguments slope - это псевдомассив, который содержит аргументы, переданные функции. Вы можете получить доступ к аргументам, используя индексы, начиная с 0.