【问题标题】:Unclear output origin输出来源不明
【发布时间】:2020-05-01 20:23:01
【问题描述】:

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

【问题讨论】:

  • 你应该调试代码。您可以设置断点并检查值并进入方法调用。这应该可以帮助您了解它是如何工作的,以及为什么您会得到所得到的输出。

标签: javascript ecmascript-6 this javascript-objects


【解决方案1】:

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

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

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

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

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

另外,值得注意的是对象没有.length 属性,但arguments 对象是array-like 对象(查看有关arguments 对象的链接),它确实

【讨论】:

  • 你能再解释一下吗,我没听懂。
  • 您调用fn 并以arguments 作为接收者,因此this 等于arguments。我建议查看MDN this 文档。
  • 如果您正在寻找输出5,您有多种选择。最简单的是将fn 设置为obj 的属性,并以obj 作为接收者来调用它。 obj.method2 = fn 然后obj.method2()。或者,您可以使用callapply 来传递特定的此参数:fn.call(this)method。两者都会记录5
  • @AbhayKumar 我已经扩展了我的答案。我希望现在更清楚了。
  • @MichalisGarganourakis 是的,非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2019-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多