不清楚输出来源

Unclear output origin

我明白为什么第一个输出是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);
    

arguments 通常是每个函数内部的一个对象,它包含传递给每个特定函数的参数值。在你的情况下:

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

所以当你arguments[0]()你实际上再次调用fn但是在这种情况下你从一个对象触发fnarguments对象)这就是关键点

因此,fn 中的 this 关键字是对 arguments 对象的引用,在本例中,它的长度值为 2,就像您传递给的参数一样您的 obj.method(fn, 1) 调用和第二次记录的值。

this 书的第 1 和 2 章对 this 的行为方式进行了更广泛的解释,可能会帮助您更多地了解您的案例.

此外,值得注意的是,一个对象没有 .length 属性,但是 arguments 对象是一个 array-like 对象(检查 link 关于 arguments 对象),确实如此