Understanding ‘this’ keyword in JavaScript

Chinmay Bansod
3 min readAug 5, 2024

JavaScript’s “this” keyword is one of the most essential yet complex features in the language. It’s used to refer to the current execution context, but its behavior can vary depending on how and where it is used. In this blog post, we’ll explore what “this” is, how it behaves in different contexts, and best practices for using it.

In JavaScript, “this” refers to the object that is currently executing the code. Its value is dynamically determined by how a function is called, which means it can change depending on the context.

1. Global Context

In the global context (i.e., outside any function or object), “this” refers to the global object. In a browser, “this” is the window object, while in Node.js, it’s the global object.

console.log(this); // In a browser, this logs the window object

2. Object Methods

When “this” is used inside a method of an object, it refers to the object itself.

const person = {
name: ‘Alice’,
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};

person.greet(); // Logs: "Hello, my name is Alice"

Here, this.name refers to the name property of the person object.

3. Constructor Functions

In constructor functions, “this” refers to the instance of the object being created.

function Person(name) {
this.name = name;
}

const alice = new Person('Alice');
console.log(alice.name); // Logs: "Alice"

In the Person constructor, this.name sets the name property on the newly created Person instance.

4. Arrow functions

Arrow functions have a unique behavior with “this”. They do not have their own “this” context; instead, they inherit “this” from their surrounding lexical context.

const person = {
name: 'Alice',
greet: function() {
setTimeout(() => {
console.log(`Hello, my name is ${this.name}`);
}, 1000);
}
};

person.greet(); // Logs: "Hello, my name is Alice"

In this example, the arrow function inside setTimeout uses “this” from the greet method, which refers to the person object.

5. Event handlers

In event handlers, “this” refers to the element that triggered the event.

document.querySelector('button').addEventListener('click', function() {
console.log(this); // Logs the button element that was clicked
});

Here, “this” refers to the button element that was clicked.

Common Pitfalls and How to Avoid Them

1. Lost Context with “this”

When passing methods as callbacks, “this” might lose its intended context.

const person = {
name: 'Alice',
greet: function() {
setTimeout(function() {
console.log(`Hello, my name is ${this.name}`); // 'this' is not bound to 'person'
}, 1000);
}
};

person.greet(); // Logs: "Hello, my name is undefined"

To avoid this, you can use arrow functions or manually bind “this”.

Using arrow functions

const person = {
name: 'Alice',
greet: function() {
setTimeout(() => {
console.log(`Hello, my name is ${this.name}`); // Arrow function inherits 'this'
}, 1000);
}
};

person.greet(); // Logs: "Hello, my name is Alice"

Using ‘bind()’

const person = {
name: 'Alice',
greet: function() {
setTimeout(function() {
console.log(`Hello, my name is ${this.name}`);
}.bind(this), 1000);
}
};

person.greet(); // Logs: "Hello, my name is Alice"

2. Global vs. Object methods

Be cautious when defining methods outside of objects. Ensure you’re not unintentionally setting “this” to the global context.

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

showThis(); // In a browser, logs the window object

Conclusion

this’ keyword in JavaScript can be tricky, but understanding its behavior in different contexts is crucial for writing effective code.

Stay tuned for more JavaScript insights and tips!

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Chinmay Bansod
Chinmay Bansod

Written by Chinmay Bansod

🇮🇳 | Software Engineer | techie

No responses yet

Write a response