再一次被javascript弄糊涂了
一些更新: 谢谢大家的帮助。我猜这可能是关键的混淆点:param区域中的“this”不被认为是函数的“内部”,因此不会遵循mdn指定的规则(这指向调用该方法的obj)。示例如下:再一次被javascript弄糊涂了,javascript,foreach,this,Javascript,Foreach,This,一些更新: 谢谢大家的帮助。我猜这可能是关键的混淆点:param区域中的“this”不被认为是函数的“内部”,因此不会遵循mdn指定的规则(这指向调用该方法的obj)。示例如下: someObj { someF(//but if "this" shows up here, it doesn't point to someObj) { //when called, "this" here will point to someObj } } 原始问题: 在阅读了许多
someObj {
someF(//but if "this" shows up here, it doesn't point to someObj) {
//when called, "this" here will point to someObj
}
}
原始问题:
在阅读了许多文件之后,我认为我对这一点有了很好的理解,但我错了
以下示例来自:
我明白:
- 需要将
传递给this
,否则在回调函数中,forEach
将指向全局/窗口(非严格模式)this
- 在
的大多数区域中,函数(数组)
指向obj(从新的此
创建),如注释所示计数器()
- 回调函数如何使用从forEach传递的“this”作为第二个参数。我对此没有任何疑问
this
(突出显示为^---Note)传递到数组对象的回调点,在本例中为[2,5,9]。为什么它会指向obj而不是数组
非常感谢你的帮助,这太让人困惑了
需要在forEach中传入“this”,否则内部函数中的“this”将指向全局/窗口(非严格模式)
此
的值取决于函数的调用方式。您看不到调用传递给forEach
(浏览器内部)的回调函数的代码。碰巧,它确实这样调用它,所以它是window
(如果不将第二个参数传递给forEach
)
作为对象方法,当函数作为对象的方法调用时,它的this设置为调用该方法的对象
这无关紧要。您没有将回调函数作为对象的方法调用。您将它传递给forEach
…然后forEach
调用它
您正在调用forEach
作为数组的一种方法,因此在forEach
函数中-您无法看到该函数,因为它是浏览器的内部-此
将是数组
为什么它会指向obj而不是数组
因为forEach
被显式设计为调用回调函数,因此forEach
的第二个参数是回调函数中的此
值
你引用了这样说的文件
需要在forEach中传入“this”,否则内部函数中的“this”将指向全局/窗口(非严格模式)
此
的值取决于函数的调用方式。您看不到调用传递给forEach
(浏览器内部)的回调函数的代码。碰巧,它确实这样调用它,所以它是window
(如果不将第二个参数传递给forEach
)
作为对象方法,当函数作为对象的方法调用时,它的this设置为调用该方法的对象
这无关紧要。您没有将回调函数作为对象的方法调用。您将它传递给forEach
…然后forEach
调用它
您正在调用forEach
作为数组的一种方法,因此在forEach
函数中-您无法看到该函数,因为它是浏览器的内部-此
将是数组
为什么它会指向obj而不是数组
因为forEach
被显式设计为调用回调函数,因此forEach
的第二个参数是回调函数中的此
值
您引用了这样说的文档。您可能会在下面将对象的
this
的引用传递为forEach()的thisArg
时看到这一点
在下面将对象的
this
的引用作为forEach()的thisArg
传递时,您可能会看到这一点
我认为你的困惑源于MDN引用中的“号召”,我不会说这是你的错。如果说在
obj.add([2,5,9])
的情况下,obj.add
被“调用”[2,5,9]
,这听起来并没有什么错。然而,他们想说的是,add
方法正在“调用”obj
不管您想如何使用它,它的工作方式(通常)是,如果您是从对象的属性调用函数,则该对象就是
此
将指向该函数内部的对象。在obj.add([2,5,9])
的情况下,add
函数是通过对象obj
访问的,因此obj
被设置为这个在add
的调用中,我认为您的混淆源于MDN引用中的“called on”一词,我不会说这是您的错。如果说在obj.add([2,5,9])
的情况下,obj.add
被“调用”[2,5,9]
,这听起来并没有什么错。然而,他们想说的是,add
方法正在“调用”obj
不管您想如何使用它,它的工作方式(通常)是,如果您是从对象的属性调用函数,则该对象就是此
将指向该函数内部的对象。在obj.add([2,5,9])
的情况下,通过对象obj
访问add
函数,因此obj
在add
的调用中被设置为此
<
function Counter() {
this.sum = 0;
this.count = 0;
}
Counter.prototype.add = function(array) {
// Here "this" points to obj
array.forEach(function(entry) {
this.sum += entry;
++this.count;
}, this);
// ^---- Note, why it points to obj, not array [2,5,9]???
// Here "this" points to obj
};
const obj = new Counter();
obj.add([2, 5, 9]);
obj.count;
// 3
obj.sum;
// 16
Counter.prototype.add = function(array) {
//here "this" points to obj
const _self = this
array.forEach(function(entry) {
// _self passed in as second argument is now `this`
console.log(this === _self) // true
this.sum += entry;
++this.count;
}, _self);
// ^---- passing in reference to the `add` object instance `this`
};