javascript中箭头函数的this指向问题


var obj = {
        say: function () {
          var f1 = () => {
            console.log('1111', this)
          }
          f1()
        },
        pro: {
          getPro: () => {
            console.log(this)
          },
        }
      }
      obj.pro.getPro()

请问这个输出为什么是window呀?箭头函数指向不是父程序的指向吗,应该是obj呀,百思不得其解,求解,感恩

chatgpt
在这个代码中,箭头函数是在 obj 对象字面量中被定义的,而 obj 对象是在全局作用域中被定义的。因为箭头函数的 this 值是在定义时就绑定的,而不是在运行时绑定的,所以在 getPro 方法中使用箭头函数时,this 始终指向的是全局对象 window。

如果想要在 getPro 方法中访问 obj 对象,可以改用普通函数,这样函数的 this 值会在运行时动态绑定到调用对象(也就是 pro 属性所在的对象 obj)上,代码如下所示:

var obj = {
  say: function () {
    var f1 = () => {
      console.log('1111', this)
    }
    f1()
  },
  pro: {
    getPro: function () {
      console.log(this)
    },
  }
}
obj.pro.getPro() // 输出: {getPro: ƒ},即 pro 对象


注意,在这种情况下,如果使用 obj.pro.getPro.bind(obj) 将 this 强制绑定到 obj 上,仍然会输出 obj.pro 对象,因为 getPro 方法是在 obj.pro 对象中定义的,而不是在 obj 对象中定义的。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/342442
  • 这篇博客你也可以参考下:JavaScript浏览器对象之window对象详解
  • 除此之外, 这篇博客: JavaScript中参数this的简单抽象化理解 this指向 window object 对象 函数中的 3.总结 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • 解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象(谁调用,this指向谁)。

    • 以函数的形式调用时,this永远都是window(全局对象)。
    • 以方法的形式调用时,this就是调用方法的那个对象(即通过对象调用函数,this指向调用函数的对象)。

    注:关于this还有些许内容本文并未提及,如严格模式、箭头函数等。

  • 您还可以看一下 李游Leo老师的JavaScript基础训练营课程中的 window的一些特性小节, 巩固相关知识点