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.

Share:
10,011
ThomasReggi
Author by

ThomasReggi

Updated on July 25, 2022

Comments

  • ThomasReggi
    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 actual function declaration it works. It seems like with the arrow function, I no longer have access to this. 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
    Felix Kling over 8 years
    Every function is lexically scoped though. It's just this (and arguments) that is special in arrow functions.
  • Mike Cluck
    Mike Cluck over 8 years
    @FelixKling Good point. Edited answer to be more accurate.