Почему следующий пример работает именно так (JavaScript)?

задача отсюда:

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

var obj = {
  length: 5,
 
  method: function(fn) {
    fn();//10, ясно, ибо this == window
    arguments[0]();//2
//	hence arguments[0]() is nothing but calling fn(). 
//Inside fn now, the scope of this function becomes the arguments array, 
//and logging the length of arguments[] will return 2.
	 
  }
};

obj.method(fn, 1);//
Вопрос: почему в вызове arguments[0](); мы имеем this как arguments? Ведь console.log(arguments[0]==fn);//true? Очевидно, как-то происходит вызов fn в контексте объекта/массива arguments, просто скобочная нотация применяется, а не точечная. Но почему в контексте объекта/массива arguments вызов fn происходит? Что, arguments[0](); как бы (с точки зрения this) соответствует точечной нотации arguments.fn()? Я перепахал англоязычный интернет, попытки объяснить этот вопрос не удались (вот, вот)

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

Александр Мальцев
Александр Мальцев
Здравствуйте!
Пояснил все моменты посредством комментариев.
var length = 10;
function fn() {
    console.log(this.length); // this - это контекст windows
}
var obj = {
    length: 5,
    method: function(fn) {
       console.log(this.length); // 5 - тут this это контекст объекта, а не window
       console.log(length); // 10 
       fn(); // 10, потому что вызвается функция, у неё this - это window
       arguments[0](); // arguments - это объект, и функция (она находится в [0])  выполняется в его контексте, а свойство length этого объекта (т.е. arguments) имеет значение 2, поэтому оно и возвращается
    }
};
obj.method(fn, 1); //