JavaScript: почему изменение переменной аргумента изменяет массив `arguments`?

Рассмотрим:

> function hello(what) {
.     what = "world";
.     return "Hello, " + arguments[0] + "!";
. }
> hello("shazow")
"Hello, world!"

Почему изменение значения what меняет значение arguments[0]?

Ответ 1

"Почему изменение значения what меняет значение arguments[0]?"

Потому что так оно и работает. Формальные параметры напрямую отображаются в индексы объекта arguments.

То есть, если вы не находитесь в строгом режиме, и ваша среда поддерживает его. Тогда обновление одного не влияет на другое.

function hello(what) {
    "use strict"; // <-- run the code in strict mode
    what = "world";
    return "Hello, " + arguments[0] + "!";
}
hello("shazow"); // "Hello, shazow!"