Почему различное значение аргументов внутри и снаружи функции foo

#javascript

Вопрос:

В этом следующем коде я не понимаю, почему аргументы[0] печатают 3 внутри функции foo, решение этой проблемы просто дает подсказку:

Вам нужно проверить, существуют ли аргументы в DOM или нет

Очевидно, что аргументы находятся внутри DOM . Или я что-то упускаю?

 var arguments = [1, 2, 3];
var arr = () => arguments[2];
arr()
console.log(arr()); // understandable it prints 3
console.log(arguments[0]);// understandable it prints 1

function foo(n) {
console.log(arguments[0]); // do not understand why it prints 3
   var f = () => arguments[0]   n; 
   return f();
}
console.log(arguments[0]); // understandable it prints 1
foo(3);  

Комментарии:

1. Аргументы относятся к списку аргументов внутри области действия функции. Внутри аргументов foo () [0] относится к n, а не к глобально объявленному массиву аргументов. Урок: не используйте зарезервированные ключевые слова в качестве имен переменных.

Ответ №1:

arguments в некоторых обстоятельствах имеет особое значение: оно относится к аргументам, переданным ближайшему предку function . По этой причине рекомендуется никогда не определять переменные с именами arguments , чтобы избежать путаницы. Попробовать это:

 const arr = [1, 2, 3];
const someFn = () => arr[2];
someFn()
console.log(someFn());
console.log(arr[0]);

function foo(n) {
  console.log(arr[0]);
  const f = () => arr[0]   n;
  return f();
}
foo(3);
console.log(arr[0]); 

и причина каждого бревна должна быть ясна как божий день, так как сейчас не происходит никаких забавных дел.

Проблема с вашим исходным кодом заключается в том, что когда вы это делаете:

 function foo(n) {
  console.log(arguments[0]); // do not understand why it prints 3
 

Ближайшим заключением (без стрелки) function , на которое arguments ссылается функция, является foo функция, и все аргументы собираются в объект, подобный массиву, и помещаются в arguments идентификатор. Приведенный выше фрагмент аналогичен выполнению:

 function foo(n) {
  const theArgs = [n]; // collect all arguments into an array-like object
  console.log(theArgs[0]); // do not understand why it prints 3
 

И так как зов foo был foo(3) , theArgs есть [3] , так theArgs[0] и содержится 3 .

Ответ №2:

Это потому argument , что в методе-ваш аргумент метода. Просто измените имя:

         var arguments1 = [1, 2, 3];
        var arr = () => arguments1[2];
        arr()
        console.log(arr()); // understandable it prints 3
        console.log(arguments1[0]);// understandable it prints 1

        function foo(n) {
            debugger
            console.log(arguments1[0]); // do not understand why it prints 3
            var f = () => arguments1[0]   n;
            return f();
        }
        console.log(arguments1[0]); // understandable it prints 1
        foo(3) 

Ответ №3:

arguments это специальное ключевое слово в Javascript. arguments представляет собой массивоподобный объект, доступный внутри функций без стрелок, который содержит значения аргументов, переданных этой функции.

Это имеет другое значение только в рамках этой функции.

Даже если вы не передаете никаких параметров, объект существует.

 let arguments = [0,1,2,3];
function func1() {
  console.log(arguments);
  console.log(arguments[0]);
}

//Arrow functions do not have special arguments object
let func2 = () =>{
  console.log(arguments);
  console.log(arguments[0]);
}

func1(1, 2, 3);
func2(1,2,3); 

Функция со стрелкой не имеет своего собственного arguments объекта. Поэтому здесь, обращаясь к arguments вам, ссылаются на arguments определенное вне его.