为什么在第二个fn函数调用期间输出为2?

时间:2017-10-05 12:43:00

标签: javascript logic

我遇到了一个Javascript示例,但对理由不太满意,或者对this内部函数的范围感到困惑。请参阅以下示例:

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

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

obj.method(fn, 1);

第一次记录10,这是可以理解的,因为它是从全局范围调用的。但是第二次记录2会让我感到困惑。我寻找答案,这就是我得到的 -

  

我们知道我们可以在JavaScript中访问任意数量的参数   函数使用arguments [] array。

     

因此,arguments0只是调用fn()。在fn里面,现在,   此函数的范围成为arguments数组,并记录   参数长度[]将返回2

有人对此有更好的答案吗?

2 个答案:

答案 0 :(得分:0)

您致电arguments[0]();

this的值因此与arguments相同。

参数是:fn, 1

其中有2个。

因此,{p> arguments.length2

答案 1 :(得分:0)

参数是类似数组的对象。调用arguments[0]()时,返回this.length的函数位于类似数组的arguments对象中。在这种情况下,关键字 this 表示参数对象。

arguments: [function fn() { return this.length; }, 1]
arguments[0](); // returns 2;

以下是另一个例子来说明我的观点:

const arr = [1, 2, function() { return this.length }];
console.log(arr[2]()); // 3

数组中的第三项是一个函数,该函数在被调用时将返回数组的长度。这类似于编写arr.length。