Присвоение указателям arguments
изменит значение связанного аргумента (назовем его n
-ым аргументом) только в том случае, если функция была вызвана как минимум с n
аргументами.Числово-индексированные свойства объекта arguments
- это, по сути, сеттеры (и геттеры):
http://es5.github.io/#x10.6
Курсивом ниже приведены мои комментарии о том, как этот процесс связанна вопрос:
(Позвольте) args
(быть) фактические аргументы, переданные внутреннему методу [[Call]]
Позвольте len
будет количеством элементов в аргументах.
Пусть indx
= len - 1
.
Повторите, пока indx >= 0
, (, поэтому приведенный ниже цикл не будет выполняться, если в функцию не переданы аргументы: )
( назначить объекту argumentsсоздается, здесь называется map
: )
- Добавить
name
в качестве элемента списка mappedNames
.
- Пусть
g
будет результатом вызова абстрактной операции MakeArgGetter
с аргументами name
и env
. - Пусть
p
будет результатом вызова абстрактной операции MakeArgSetter
с аргументами name
и env
. - Вызвать внутренний метод [[DefineOwnProperty]] для
map
, передавая ToString (indx
), дескриптор свойства {[[Set]]: p
, [[Get]]: g
, [[Настраиваемый]]: true
} и false
в качестве аргументов.
Таким образом, если функция вызывается без аргументов, не будетустановить на arguments[0]
, поэтому переназначение его не изменит параметр с индексом 0.
То же самое происходит и с другими индикаторами - если вы вызываете функцию с 1 параметром, но функция принимаетдва параметра, присвоение arguments[1]
не изменит второй параметр, потому что arguments[1]
не имеет установщика:
function fn(a, b) {
arguments[1] = 'bar';
console.log(b);
}
fn('foo');
То есть
a()
и a(undefined)
- это одно и то же, верно?
неслучай, потому что второе приводит к arguments
объекту с установщиком и получателем по индексу 0, в то время как первый - нет.