Why can't I access `this` within an arrow function?
10,011
Arrow functions perform lexical binding and uses the surrounding scope as the scope of this
. For example, imagine (for some weird reason) you define Cat
inside of a Dog
constructor.
function Dog() {
// do dog like things
function Cat() { ... }
Cat.prototype.sound = () => {
// this == instance of Dog!
};
}
So whatever the surrounding scope is becomes the scope of an arrow function.
Author by
ThomasReggi
Updated on July 25, 2022Comments
-
ThomasReggi almost 2 years
This code below should work as expected, and log
"meow"
, here an example.function Cat () { this.animalNoise = 'meow' } Cat.prototype.sound = () => { console.log(this.animalNoise) } let cat = new Cat() cat.sound()
It doesn't work, this error appears
TypeError: Cannot read property 'animalNoise' of undefined
and when you convert the arrow function to an actualfunction
declaration it works. It seems like with the arrow function, I no longer have access tothis
. What's going on here?To be clear, the above code does not work where the following does, and I'm very curious why.
function Cat () { this.animalNoise = 'meow' } Cat.prototype.sound = function() { console.log(this.animalNoise) } let cat = new Cat() cat.sound()
-
Felix Kling over 8 yearsEvery function is lexically scoped though. It's just
this
(andarguments
) that is special in arrow functions. -
Mike Cluck over 8 years@FelixKling Good point. Edited answer to be more accurate.