Почему добавление значения параметра по умолчанию меняет поведение при изменении аргументов? - PullRequest
3 голосов
/ 18 апреля 2019

Первый раздел:

var a = 1;

function fn2(a) {
  arguments[0] = 20;
  var a = 22;
  console.log(a);
  console.log(arguments[0]);
}
fn2(a);

Второй раздел:

var a = 1;

function fn2(a, b = 100) {
  arguments[0] = 20;
  var a = 22;
  console.log(a);
  console.log(arguments[0]);
}
fn2(a);

Я могу понять, почему в первом разделе кодов он, наконец, выведет 22 и 22, поскольку arguments[0] и a фактически оба указывают на параметр a. Тем не менее, во втором разделе кодов (который добавляет еще один параметр b), он, наконец, выводит 22 и 20. Я догадался, что это связано с дополнительным параметром b, и искал некоторые сообщения. И в MDN я нашел:

Когда нестрогая функция содержит rest, default или destructured параметров, то значения в объекте аргументов не отслеживают значения аргументов. Вместо этого они отражают предоставленные аргументы когда функция была вызвана

А вот пример кода из MDN:

function func(a = 55) { 
  arguments[0] = 99; // updating arguments[0] does not also update a
  console.log(a);
}
func(10); // 10

Я могу понять, что это значит, но в моем вопросе все по-другому.

  1. В примере MDN это a, который указывает на arguments[0], имеет значение по умолчанию, в то время как в моем вопросе это b, который не указывает на arguments[0], имеет значение по умолчанию , Это 2 разных условия.

  2. Я также отладчик в консоли и обнаружил, что:

enter image description here

почему здесь у нас 2 a? Один в блоке, а другой в местном. Так какой же на самом деле параметр a? А откуда еще один a (который не является параметром)?

1 Ответ

1 голос
/ 18 апреля 2019

В примере MDN это a, которое указывает на аргументы [0], имеет значение по умолчанию, в то время как в моем вопросе это b, которое не указывает на аргументы [0], имеет значение по умолчанию. Это 2 разных условия.

Либо существует хотя бы один параметр rest / default / destructured, в этом случае присвоение no любым признакам arguments приведет к изменению связанной переменной, или нет остальных / стандартных / деструктурированных параметров, в этом случае все назначения для любых признаков arguments приведут к изменению связанной переменной.

Либо каждый индекс arguments изменит свою связанную переменную, либо ни один не изменит. Таким образом, даже если только b (arguments[1]) имеет назначение по умолчанию, когда b имеет назначение по умолчанию, изменения на arguments[0] также приведут к изменениям a.

почему здесь у нас 2 а? Один в блоке, а другой в местном. Так какой из них на самом деле параметр а? А откуда другой a (который не является параметром)?

Я почти уверен, что отладчик Chrome просто запутался, потому что у вас есть var a, когда a уже существует в области видимости в качестве параметра. Переменные появляются в разделе «блок», когда они либо

(1) объявлено на верхнем уровне функции (с const, let или var) или

(2) объявлено с const или let внутри нефункционального блока

var перед a, когда a уже существует в области видимости, является полностью лишним.

...