为啥我不能在箭头函数中访问“this”? [复制]

Posted

技术标签:

【中文标题】为啥我不能在箭头函数中访问“this”? [复制]【英文标题】:Why can't I access `this` within an arrow function? [duplicate]为什么我不能在箭头函数中访问“this”? [复制] 【发布时间】:2016-03-16 11:03:22 【问题描述】:

下面的代码应该可以按预期工作,并记录"meow"、here an example。

function Cat () 
  this.animalNoise = 'meow' 


Cat.prototype.sound = () => 
  console.log(this.animalNoise)


let cat = new Cat()
cat.sound()

它不起作用,出现此错误 TypeError: Cannot read property 'animalNoise' of undefined 并且当您将箭头函数转换为实际的 function 声明时它起作用。似乎使用箭头功能,我不再可以访问this。这里发生了什么?

需要明确的是,上面的代码不起作用下面的代码不起作用,我很好奇为什么。

function Cat () 
  this.animalNoise = 'meow' 


Cat.prototype.sound = function() 
  console.log(this.animalNoise)


let cat = new Cat()
cat.sound()

【问题讨论】:

与函数表达式相比,箭头函数表达式(也称为胖箭头函数)的语法更短,并且词法绑定 this 值 -- developer.mozilla.org/en-US/docs/Web/javascript/Reference/… 已经有多个关于此的问题。请使用搜索。 不过,总的来说,我很好奇人们如何/在哪里了解箭头函数没有也了解this 在箭头函数中的行为。这种差异是箭头函数不可或缺的一部分,我似乎不可能不知道它。 【参考方案1】:

Arrow functions perform lexical binding 并使用周围的范围作为this 的范围。例如,假设(出于某种奇怪的原因)您在 Dog 构造函数中定义了 Cat

function Dog() 
  // do dog like things
  function Cat()  ... 
  Cat.prototype.sound = () => 
    // this == instance of Dog!
  ;

因此,无论周围的范围是什么,都变成了箭头函数的范围。

【讨论】:

每个函数都是词法范围的。只是this(和arguments)在箭头函数中是特殊的。 @FelixKling 好点。编辑后的答案更准确。

以上是关于为啥我不能在箭头函数中访问“this”? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能在 firebase 'then' 回调中访问 vuejs 'this'? [复制]

为啥我能够使用 this.state 而无需绑定或使用箭头函数 React

为啥js的箭头函数的this指向的是全局呢?

在 GHCi 中,为啥函数箭头 `:kind (->)` 的种类包含问号 `(->) :: ?? ->? -> *`? [复制]

常规函数和箭头函数的this绑定问题

为啥箭头函数没有参数数组? [复制]