Skip to main content

Command Palette

Search for a command to run...

Understanding the this Keyword in JavaScript

Updated
3 min readView as Markdown
Understanding the this Keyword in JavaScript

If you've spent any time with JavaScript, you've probably run into this and thought — what exactly is this thing? Don't worry. It confused everyone at some point. Let's break it down simply.

1. What this Represents

Here's the simplest way to think about it:

this refers to whoever called the function.

That's it. this is not about where the function is written — it's about who called it. The caller sets the value of this. Keep that idea in your head and everything else will make more sense.

2. this in Global Context

When you use this outside of any function or object — just floating at the top level — it points to the global object.

  • In a browser, that's window

  • In Node.js, that's global

console.log(this); // window (in browser)

Nothing fancy here. You're at the top level, so the global object is the caller.

3. this Inside Objects

This is where this starts to feel useful. When a function lives inside an object and you call it through that object, this becomes the object itself.

const user = {
  name: "Aryan",
  greet() {
    console.log("Hello, " + this.name);
  }
};

user.greet(); // Hello, Aryan

user called greet(), so this is user. Simple.

4. this Inside Functions

This one trips people up. When you call a plain function (not through an object), this behaves differently depending on the mode:

  • In non-strict modethis is the global object

  • In strict modethis is undefined

function sayHi() {
  console.log(this);
}

sayHi(); // window (non-strict) or undefined (strict)

Nobody specific called sayHi() here — it was just invoked directly. So JavaScript either falls back to global or gives you nothing in strict mode.

5. How Calling Context Changes this

Here's the key insight: the same function can have a different this depending on how you call it.

const person = {
  name: "Sara",
  greet() {
    console.log(this.name);
  }
};

const greetFn = person.greet;

person.greet(); // "Sara"  → called through object, this = person
greetFn();      // undefined → called as plain function, this = global/undefined

Same function. Different caller. Different this.

You can also manually control this using .call(), .apply(), or .bind():

greetFn.call(person); // "Sara" → you're forcing this = person

Quick Recap

How the function is called What this is
At the top level Global object (window)
As an object method That object
As a plain function Global or undefined (strict)
With .call() / .bind() Whatever you pass in

Once you stop thinking of this as something fixed and start thinking of it as "who's calling right now?" — it becomes a lot less scary. JavaScript is just asking: hey, who made this call? And this is the answer.