this Keyword in JavaScript
The this keyword in JavaScript is one of the most powerful yet confusing concepts for developers, especially for those new to the language. Its behaviour can vary depending on the context in which it's used, such as within functions, methods, or even in different environments (global, browser, or strict mode).

In this article, we’ll explore what the this keyword is, how it works in various scenarios, and how you can better understand and control its behavior in JavaScript.
this in JavaScript
In JavaScript, this refers to the context in which a function is executed. It gives you access to the object on which the function is being called. The value of this is not fixed and can change depending on how and where a function is invoked.
Example:
const person = {
name: 'Alice',
greet: function() {
console.log(this.name);
}
};
person.greet(); // Output: Alice
In this example, this inside the greet function refers to the person object. Thus, this.name equals 'Alice'.
The Value of this in Different Contexts
The value of this is determined by the call site of a function. Let's explore how this behaves in various scenarios:
1. this in the Global Context
When this is used outside of any function or object method (in the global scope), its value depends on the environment.
-
In a Browser:
thisrefers to thewindowobject (the global object in browsers).console.log(this); // Output: Window -
In Node.js:
thisrefers to theglobalobject (the global object in Node.js).console.log(this); // Output: {}
2. this in Object Methods
When this is used inside an object method, it refers to the object that "owns" the method.
const car = {
brand: 'Toyota',
getBrand: function() {
return this.brand;
}
};
console.log(car.getBrand()); // Output: Toyota
Here, this.brand refers to car.brand, so this inside the getBrand method points to the car object.
3. this in Functions
When this is used inside a regular function (non-method function), its behavior changes based on how the function is called.
-
In non-strict mode:
thisrefers to the global object (windowin the browser orglobalin Node.js).function show() { console.log(this); // Output: Window (in a browser) } show(); -
In strict mode:
thisisundefinedin a regular function.'use strict'; function show() { console.log(this); // Output: undefined } show();
Calling Functions as Methods
When a function is invoked as a method of an object, this refers to that object.
const user = {
name: 'John',
showName: function() {
console.log(this.name);
}
};
user.showName(); // Output: John
However, if you assign this method to another variable and invoke it separately, the value of this changes.
const display = user.showName;
display(); // Output: undefined (or error in strict mode)
In this case, this refers to the global object, because display() is called as a regular function, not as a method of the user object.
4. this in Constructors
When using constructors (functions used to create objects with the new keyword), this refers to the newly created object.
function Animal(type) {
this.type = type;
}
const cat = new Animal('Cat');
console.log(cat.type); // Output: Cat
In this case, this inside the Animal constructor refers to the newly created cat object.
5. this in Arrow Functions
Arrow functions have different behavior for this. Unlike regular functions, arrow functions do not have their own this. Instead, they inherit this from their surrounding (lexical) context.
const obj = {
name: 'Sara',
sayHello: function() {
const arrowFunc = () => {
console.log(this.name);
};
arrowFunc();
}
};
obj.sayHello(); // Output: Sara
In this example, the this in the arrow function refers to the this in the outer method sayHello, which is the obj object. Arrow functions are particularly useful when you want to avoid binding or changing the context of this.
Binding this: call(), apply(), and bind()
JavaScript provides ways to manually control the value of this using the call(), apply(), and bind() methods.
1. call() Method
The call() method allows you to specify what this should refer to when calling a function.
function greet() {
console.log('Hello, ' + this.name);
}
const person = { name: 'Alice' };
greet.call(person); // Output: Hello, Alice
In this example, greet.call(person) explicitly sets this to refer to the person object.
2. apply() Method
The apply() method works like call(), but it takes arguments as an array.
function introduce(greeting) {
console.log(greeting + ', I am ' + this.name);
}
const user = { name: 'John' };
introduce.apply(user, ['Hi']); // Output: Hi, I am John
3. bind() Method
The bind() method creates a new function where this is permanently set to the specified value. Unlike call() and apply(), bind() does not invoke the function immediately but returns a new function.
function showInfo() {
console.log(this.name);
}
const person = { name: 'Emma' };
const boundFunction = showInfo.bind(person);
boundFunction(); // Output: Emma
Common Mistakes with this
-
Losing context inside callbacks: When passing object methods as callbacks, the value of
thiscan get lost if the method is invoked in a different context.const obj = { name: 'Tom', showName: function() { console.log(this.name); } }; setTimeout(obj.showName, 1000); // Output: undefinedTo avoid this, you can use
.bind()or an arrow function:setTimeout(() => obj.showName(), 1000); // Output: Tom -
Confusion with
thisin arrow functions: Arrow functions are not suitable as methods because they do not have their ownthis. Using them as methods will lead to unexpected behavior.const user = { name: 'John', show: () => console.log(this.name) }; user.show(); // Output: undefined
Summary of this in JavaScript
- In the global context,
thisrefers to the global object (windowin the browser). - In object methods,
thisrefers to the object the method belongs to. - In regular functions,
thisrefers to the global object (in non-strict mode) orundefined(in strict mode). - In constructors,
thisrefers to the newly created object. - Arrow functions do not have their own
thisand instead inheritthisfrom their lexical scope. - Use
call(),apply(), andbind()to control the value ofthisin specific contexts.
Understanding this in JavaScript is key to mastering the language and writing more effective, bug-free code. By paying attention to the context in which a function is invoked and the way this behaves, you can avoid common mistakes and create more predictable programs.