Нет привязки аргументов в JavaScript

1

Может ли кто-нибудь объяснить мне поведение этого кода?

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.

  • 0
    Внутри foo argruments[0] имеет 1 значение, поскольку аргумент foo равен 1 . f(2) вызывает функцию f с аргументом 2, которая вызывает функцию стрелки и добавляет 2 к аргументу [0], равному 1. Следовательно, на выходе получается 3.
  • 0
    @HassanImam где функция f ?
Показать ещё 5 комментариев
Теги:

2 ответа

0
Лучший ответ

Чтобы сделать это немного яснее для вас, я переписал его как 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 и извлекает первое значение в функции стрелки.

  • 0
    Таким образом, var f будет неопределенной до тех пор, пока выполнение не достигнет return f(2) ?? Как i не имею значения , возложенные на него изначально.
  • 0
    Нет, это не будет неопределенным. <edit> Это будет неопределенным, пока интерпретатор JavaScript не достигнет объявления var f </ edit> Значение f станет функцией стрелки, как только интерпретатор выполнит объявление var f. Он вернет значение, когда вы его называете. например, f (2);
1

Функции 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)
}
  
  
  • 0
    Каково будет значение var f когда функция вызывается как foo(1) перед выполнением return f(2) ?? Примечание : перед возвратом (во второй строке функции) у нас нет значения для i пока мы не достигнем функции return .
  • 0
    Значением var f будет функция анонимной стрелки. Это не будет явным значением до тех пор, пока не будет вызвано, как обычная функция. Как только вы вызовете его, он вернет значение аргументов [0] + 1
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню