Неясное происхождение продукции - PullRequest
1 голос
/ 01 мая 2020

Я понимаю, почему первый вывод равен 10, но я не могу понять, почему второй вывод равен 2

var length = 10;
function fn() {
	console.log(this.length);
}

var obj = {
  length: 5,
  method: function(fn) {
    fn();
    arguments[0]();
  }
};

obj.method(fn, 1);
    

1 Ответ

3 голосов
/ 01 мая 2020

arguments в общем случае - это объект внутри каждой функции, который содержит значения аргументов, передаваемых каждой указанной c функции. В вашем случае:

obj.method(fn, 1);
//          ^  ^  arguments object will have those 2 values

Поэтому, когда вы arguments[0]() на самом деле снова вызываете fn , но , в этом случае вы запускаете fn из объекта (объекта arguments) ) и это ключевой момент .

Из-за этого ключевое слово this в вашем fn является ссылкой на объект arguments, который в данном случае имеет значение длины 2, как аргументы, которые вы передали вашему вызову obj.method(fn, 1) и значение, которое записывается во второй раз.

Глава 1 & 2 из Эта книга содержит более расширенное объяснение того, как this ведет себя и может помочь Вы немного больше понимаете свой случай.

Также стоит отметить, что у объекта нет свойства .length, но в то время как объект arguments является объектом array-like (проверьте ссылку на arguments объект) 1035 *.

...