Mastering the 'this' Keyword for JavaScript Developers

The this keyword in JavaScript is a fundamental concept that can be a bit tricky to grasp because its value depends on how a function is called. Here's a detailed explanation:

1. What is this`?💻

  • The this keyword refers to the object that is currently executing the code.

  • In simpler terms, this provides a way to access the object in which a function or a method is a property.

2. Global Context🌏

  • When used in the global context (outside of any function), this refers to the global object.

    • In a browser, this is the window object.

    • In Node.js, this is the global object.

console.log(this); // In a browser, it will log the `window` object

3. Function Context🚦

  • Inside a regular function (not an arrow function), this refers to the global object in non-strict mode, and undefined in strict mode.
function show() {
  console.log(this);
}

show(); // In non-strict mode, logs the global object (e.g., `window` in browsers)

4. Method Context🌦

  • When a function is called as a method of an object, this refers to the object that the method belongs to.
const obj = {
  name: "Priyanka",
  greet: function() {
    console.log(this.name);
  }
};

obj.greet(); // Logs "Priyanka", as `this` refers to `obj`

5. Constructor Context 🚒

  • When a function is used as a constructor (called with new), this refers to the newly created object.
function Person(name) {
  this.name = name;
}

const person1 = new Person("Priyanka");
console.log(person1.name); // Logs "Priyanka"

6. Event Handlers🦽

  • In an event handler, this refers to the element that received the event.
const button = document.querySelector('button');
button.addEventListener('click', function() {
  console.log(this); // Logs the button element
});

7. Arrow Functions🎈

  • Arrow functions behave differently with this. They do not have their own this context; instead, they inherit this from the surrounding non-arrow function or global context where they are defined.
const obj = {
  name: "Priyanka",
  greet: function() {
    const arrowFunc = () => console.log(this.name);
    arrowFunc();
  }
};

obj.greet(); // Logs "Priyanka", as arrow function inherits `this` from `greet` method

8. Explicit Binding🛠

  • You can explicitly set this using call, apply, or bind.
function greet() {
  console.log(this.name);
}

const person = { name: "Priyanka" };

greet.call(person); // Logs "Priyanka", as `this` is explicitly set to `person`

9. Default Binding🎃

  • When none of the above rules apply, and the function is called in a simple function call (not as a method, constructor, or with explicit binding), this defaults to the global object in non-strict mode and undefined in strict mode.

Summary📃

  • The value of this is determined by how a function is called.

  • In the global context, this refers to the global object.

  • In an object's method, this refers to the object.

  • In a constructor, this refers to the new instance.

  • Arrow functions do not have their own this and inherit from their enclosing context.

  • Explicit binding methods (call, apply, bind) can override the default this value.

13
Subscribe to my newsletter

Read articles from priyanka chaudhari directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

priyanka chaudhari
priyanka chaudhari

i am a full stack web developer and i write code....