对于对象数组中的函数,“this”的值是多少?

What will be the value of 'this' for a function in an array in an object?

提问人:Prakhar Tripathi 提问时间:10/22/2023 最后编辑:Darryl NoakesPrakhar Tripathi 更新时间:10/23/2023 访问量:101

问:

数组中函数的值是多少,它是 的属性?另外,是正常函数还是方法?thismethodArraymyObjectmethodArray[0]

let myObject = {
  property: "Prakhar",
  methodArray: [
    function () {
      console.log(this);
    },
  ],
};

myObject.methodArray[0]();

在浏览器中执行此代码时,它正在打印数组。不知道为什么会这样?理想情况下,如果函数不是方法或函数是方法,则它应该是窗口对象(全局)。myObject

javascript 这个

评论

3赞 Davedude 10/22/2023
当我运行代码时,我得到一个包含函数的数组。
1赞 Pointy 10/22/2023
请注意,函数本质上不是方法;这完全取决于函数的调用方式。函数与对象没有永久关系,除非通过绑定显式完成。
2赞 Jaromanda X 10/22/2023
显然是myObject.methodArray
1赞 Wyck 10/22/2023
等同于:如果您期望以某种方式与定义方式相关。myObject["methodArray"][0]().this
0赞 Afzal K. 10/22/2023
methodArray[0]是一个函数,而不是一个方法。当它作为对象的一部分被调用时,它是一个方法,但是当它像本例中一样被直接访问时,它只是一个普通的函数。

答:

5赞 jsejcksn 10/22/2023 #1

内部函数的价值是什么?thismethodArray

这取决于函数的调用方式。

有关 的深入概述,请参阅 > 函数上下文> MDN。下面是适用于示例中的代码的引用代码片段:this

对于典型函数,值是访问该函数的对象。换言之,如果函数调用的形式为 ,则引用 。thisobj.f()thisobj

在您的示例中...

myObject.methodArray[0]();

...该函数作为数组属性处的方法调用(请记住,数组是对象,并且使用括号表示法访问属性),因此 will 的值是数组。0methodArray0this

为了进一步说明,下面是示例代码的略微修改版本,它返回函数的内部值,以便它可以用于函数外部的比较:this

let myObject = {
  property: "Prakhar",
  methodArray: [
    function () {
      return this;
    },
  ],
};

const thisResult = myObject.methodArray[0]();

console.log(thisResult === myObject.methodArray); // true


也是函数还是方法?methodArray[0]

方法是一个函数,它是对象的属性。因此,数组对象的 at 属性函数是一个方法。0

评论

0赞 Darryl Noakes 10/22/2023
如果您提到用于控制,那就太好了。以及与箭头函数的区别(基于声明站点而不是调用站点)。:)bind()thisthis
0赞 Afzal K. 10/22/2023
箭头函数没有自己的绑定,所以我们不能用来改变它吗?thisbind()
2赞 jsejcksn 10/23/2023
^@DarrylNoakes 感谢您的反馈。我想让答案集中在所提出的问题上,因为关键字的主题已经很抽象,并且已经在这个网站上得到了广泛的介绍。我在回答之前搜索了重复项,并惊讶地发现我没有找到这个重复的目标。MDN 文章的链接非常详细地涵盖了所有内容(这里不适合单一的答案)。this
0赞 Prakhar Tripathi 10/23/2023
感谢您@jsejcksn的详细解释。我试着向 Chatgpt 问这个问题,但它给出了错误的答案。有趣的是,数组中的函数也是方法,因为数组最终是对象。
0赞 Darryl Noakes 10/23/2023
@jsejcksn 当然,明白了