【问题标题】:Why the output is 2 during second fn function call?为什么在第二次 fn 函数调用期间输出为 2?
【发布时间】:2017-10-05 12:43:00
【问题描述】:

我遇到了一个 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[] 数组的函数。

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

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

【问题讨论】:

    标签: javascript logic


    【解决方案1】:

    你拨打arguments[0]();

    因此this 的值与arguments 相同。

    参数是:fn, 1

    有两个。

    arguments.length 因此是2

    【讨论】:

    • 这是否意味着重要的是函数的调用者而不是调用它的范围/块?
    • 在这种情况下。是的。范围与this 的值无关(好吧,除非您使用箭头函数从创建它们的范围中复制this 的值)。
    • 知道了。会记住这一点。 this 没那么容易 ;)
    【解决方案2】:

    Arguments 是一个类似数组的对象。当您调用 arguments[0]() 时,返回 this.length 的函数位于类似数组的参数对象中。在这种情况下,关键字 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。

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2021-04-21
      • 2023-01-28
      相关资源
      最近更新 更多