Arrow functions make this simpler — but only if you know the rules. Here are the 3 traps developers fall into (and how to escape them).
this simpler — but only if you know the rules. Here are the 3 traps developers fall into (and how to escape them).Introduction: The “Why is this Undefined?” Bug
We’ve all been there: you write a function, expect this to point to your object, but instead… it’s undefined or window.
Arrow functions were supposed to fix this madness, right?
Well, yes and no.
The truth: arrow functions handle this differently from traditional functions — sometimes that’s exactly what you need, other times it breaks everything.
Let’s look at the 3 most common mistakes developers make with this in arrow functions, with real-world examples and fixes.
1. Using Arrow Functions as Object Methods
The Mistake
const user = {
name: "Ali",
greet: () => `Hi, I’m ${this.name}`
};
console.log(user.greet());
// ❌ "Hi, I'm undefined"
Why It Happens
Arrow functions don’t have their own this. They inherit this from the outer scope, which here is the global object, not user.
The Fix
Use a regular function for object methods:
const user = {
name: "Ali",
greet() {
return `Hi, I’m ${this.name}`;
}
};
console.log(user.greet());
// ✅ "Hi, I'm Ali"
💡 Rule: Don’t use arrows for object methods that need this.
2. Using Arrow Functions as Constructors
The Mistake
const Person = (name) => {
this.name = name;
};
const p = new Person("Sara");
// ❌ TypeError: Person is not a constructor
Why It Happens
Arrow functions cannot be used as constructors. They don’t have their own this or prototype.
The Fix
Use a regular function or class:
function Person(name) {
this.name = name;
}
const p = new Person("Sara");
console.log(p.name);
// ✅ "Sara"
💡 Rule: If you’re building objects with new, arrows are the wrong tool.
3. Breaking Event Handlers with Arrows
The Mistake
const button = document.querySelector("button");
button.addEventListener("click", () => {
console.log(this); // ❌ Window, not the button
});
Why It Happens
Event listeners often rely on this being the element. Arrow functions don’t bind this, so you lose that reference.
The Fix
Use a regular function:
button.addEventListener("click", function () {
console.log(this); // ✅ Refers to the button
});
💡 Rule: In event listeners, use regular functions if you want this to point to the element.
Wrapping It All Up
Here are the 3 most common mistakes with this in arrow functions:
- Using arrows as object methods → breaks
this. - Using arrows as constructors → not allowed.
- Using arrows in event handlers →
thiswon’t point to the element.
👉 The golden rule:
- Use arrow functions when you want lexical
this(timers, callbacks, React methods). - Use traditional functions when you need dynamic
this(objects, constructors, DOM events).
Call to Action
👉 Have you been bitten by the “undefined this” bug before? Drop your story in the comments 👇.
📤 Share this with a teammate who still confuses arrow vs traditional functions.
🔖 Bookmark this as your quick this survival guide.


Leave a Reply