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

Serega Novikov
613
1
0
задача отсюда:
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. Александр Мальцев
    19 декабря 2017, 15:21
    Здравствуйте!
    Пояснил все моменты посредством комментариев.
    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); //
    
    Войдите, пожалуйста, в аккаунт, чтобы оставить комментарий.