Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
再一次被javascript弄糊涂了_Javascript_Foreach_This - Fatal编程技术网

再一次被javascript弄糊涂了

再一次被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 } } 原始问题: 在阅读了许多

一些更新: 谢谢大家的帮助。我猜这可能是关键的混淆点: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
    }
}
原始问题:

在阅读了许多文件之后,我认为我对这一点有了很好的理解,但我错了

以下示例来自:

我明白:

  • 需要将
    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`


};