对于这种情况,我对箭头函数中的“this”关键字感到困惑

Mad*_*sal 0 javascript closures ecmascript-6 arrow-functions

我有两种情况,我对得到的输出感到困惑。

情况1 :

let x = {
  b: 5,
  y: function a() {
    return function() {
      return () => {
        console.log(this);
      }
    }
  }
}
x.y()()();
Run Code Online (Sandbox Code Playgroud)

在运行时,x.y()()()我将Window对象作为输出,但根据箭头函数的定义,输出应该是其父函数。

案例2:

let x = {
  b: 5,
  y: function a() {
    return () => {
      console.log(this);
    }
  }
}
x.y()();
Run Code Online (Sandbox Code Playgroud)

如果我删除一层嵌套,这是一个基本示例,然后在运行时x.y()(),我将获取对象x作为输出。

你能解释一下为什么我会得到这些输出吗?

Cer*_*nce 5

this函数的内部由其调用上下文以及函数是否为箭头函数决定。

带有箭头的函数,this总是从外部作用域继承而来。

如果被调用的函数是完整的,function 并且该函数被作为对象的属性调用(例如obj.foo()),则调用上下文,thisfoo函数内部,是obj

如果被调用的函数是完整的function但是是独立的——也就是说,不是对象的属性——那么没有调用上下文,this函数内部将是undefined或 全局对象。

let x = {
  b: 5,
  y: function a() {
    return function() {
      return () => {
        console.log(this === window);
      }
    }
  }
}
x.y()()();
Run Code Online (Sandbox Code Playgroud)

this就是返回函数的this内容 - 即此处调用的函数的调用上下文:

x.y()()
Run Code Online (Sandbox Code Playgroud)

被调用的函数不是对象的一部分——它是一个独立的函数表达式,它是通过调用对象上的先前函数而创建的,相当于:

(x.y())()
Run Code Online (Sandbox Code Playgroud)

因此,没有调用上下文,并且this是全局对象。

相反,在情况2中,最近的祖先function被称为是a在功能上y的对象的属性,并且该功能调用一个调用上下文:

x.y()()
^^^^^
Run Code Online (Sandbox Code Playgroud)

以上,y被称为用的调用上下文x,因此thisx内部a功能。