Может ли кто-нибудь объяснить мне поведение этого кода?
var arguments = 42;
var arr = () => arguments;
arr(); // 42
function foo() {
var f = (i) => arguments[0] + i; // foo implicit arguments binding
return f(2);
}
foo(1); // 3
Я знаю, что такое привязка неявных аргументов.
Я не понимаю, как foo(1)
возвращает 3?
Что делает return f(2)
? Как в какой функции он звонит?
PS: Я следую этим документам Mozilla.
Чтобы сделать это немного яснее для вас, я переписал его как ES5
function foo(){
var arg1 = arguments[0]; // argument is 1 in your example
var f = function(i) {
return arg1 + i; // i is 2 in your example
};
return f(2); // returns 3
}
foo(1); // sets argument to 1 and returns 3
В ES6 функции стрелок не имеют свойства аргументов, как стандартные функции. Вы получаете доступ к массиву аргументов функции foo как к объекту. Поскольку первый аргумент, который вы передали, равен 1, функция стрелки обращается к объекту аргументов функции foo и извлекает первое значение в функции стрелки.
var f
будет неопределенной до тех пор, пока выполнение не достигнет return f(2)
?? Как i
не имею значения , возложенные на него изначально.
Функции Arrow не связывают arguments
поэтому, когда вы используете arguments[0]
внутри f
вы foo
доступ к аргументам foo
(например, 1
). Поскольку вы прошли 2 как i
вы получаете 1 + 2
Например, если вы используете функцию стрелки, которая пытается получить доступ к аргументам вне вызова функции, вы должны получить ReferenceError
const f = i => console.log(arguments[0])
try {
f()
console.assert(false, 'should not get here')
} catch (e) {
console.assert(e instanceof ReferenceError,
'should get reference error on trying to access arguments')
console.log(e.message)
}
var f
когда функция вызывается как foo(1)
перед выполнением return f(2)
?? Примечание : перед возвратом (во второй строке функции) у нас нет значения для i
пока мы не достигнем функции return
.
foo
argruments[0]
имеет1
значение, поскольку аргументfoo
равен1
.f(2)
вызывает функциюf
с аргументом 2, которая вызывает функцию стрелки и добавляет 2 к аргументу [0], равному 1. Следовательно, на выходе получается 3.f
?