#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
определенное вне его.