Skip to content

Instantly share code, notes, and snippets.

@jonschlinkert
Last active February 3, 2018 05:52
Show Gist options
  • Save jonschlinkert/91709be48dea6689d11d to your computer and use it in GitHub Desktop.
Save jonschlinkert/91709be48dea6689d11d to your computer and use it in GitHub Desktop.
How `this` works in JavaScript

this

In JavaScript, this is a reference to the calling object of the function. For example:

var letters = {  // <= `this` (letters) is the calling object
  letter: 'A',
  getLetter: function () {
    // here, `this.letter` = `letters.letter`
    console.log(this.letter);
  }
};

letters.getLetter();
//=> A

Nested object

Let's try the same thing on a nested object:

var letters = {
  letter: 'A',
  getLetter: function () {
    console.log(this.letter);
  },
  nested: { // <= `nested` is the calling object, e.g. `this`, for nested.getLetter()
    letter: 'BB',
    getLetter: function () {
      console.log(this.letter);
    }
  }
};

letters.getLetter();
//=> A

letters.nested.getLetter();
//=> BB

Object inside a function

How about when this is used on an object inside a function?

var letters = {
  letter: 'A',
  getLetter: function () {
    console.log(this.letter);

    var inner = {}; // <= `inner` is the calling object, e.g. `this`, for inner.getLetter()

    inner.letter = 'inner-A';
    inner.getLetter = function () {
      console.log(this.letter);
    };

    return inner.getLetter();
  }
};

letters.getLetter();
//=> A
//=> inner-A

Function inside a function (in an object)

How about when this is used on a function inside an object?

var letters = {
  letter: 'A',
  getLetter: function () {
    console.log(this.letter);

    function someFn() {
      console.log(this.letter);
    }
    return someFn();
  }
};

letters.getLetter();
//=> undefined

We need to create a reference to this to be used in the function:

var letters = {
  letter: 'A',
  getLetter: function () {
    console.log(this.letter);
    var self = this;

    function someFn() {
      console.log(self.letter);
    }
    return someFn();
  }
};

letters.getLetter();
//=> A
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment