JavaScript this keyword
last modified April 16, 2025
In this article we explore the JavaScript this keyword, which refers
to the context in which code is executed. Understanding this is
crucial for object-oriented programming in JavaScript.
The this keyword
The this keyword in JavaScript refers to the object it belongs to.
Its value is determined by how a function is called (runtime binding). In most
cases, this refers to the object that owns the currently executing
code.
The value of this changes depending on the execution context. In
global scope, this refers to the global object (window in browsers).
Inside a method, this refers to the owner object.
Arrow functions don't have their own this binding. Instead, they
inherit this from the parent scope at creation time. This makes
arrow functions particularly useful for callbacks and event handlers.
Global context
In the global execution context, this refers to the global object.
console.log(this === window); // true in browser this.globalVar = 'Hello'; console.log(window.globalVar); // 'Hello'
In a browser environment, the global object is window. When we
assign a property to this in global scope, it becomes a global
variable. This demonstrates that this refers to the global object.
$ node main.js true Hello
Function context
In a regular function, this depends on how the function is called.
function showThis() {
console.log(this);
}
showThis(); // window/global in non-strict, undefined in strict
In non-strict mode, this in a function refers to the global object.
In strict mode, it's undefined. This example shows the default binding of
this in function calls.
$ node main.js
Object [global] {
// ... global object properties
}
Method context
When a function is called as a method of an object, this refers to
the object.
const person = {
name: 'John',
greet: function() {
console.log(`Hello, my name is ${this.name}`);
}
};
person.greet();
Here, this inside the greet method refers to the
person object. We can access the object's properties through
this. This is called implicit binding.
$ node main.js Hello, my name is John
Constructor context
In constructor functions, this refers to the newly created instance.
function Car(make, model) {
this.make = make;
this.model = model;
this.info = function() {
console.log(`${this.make} ${this.model}`);
};
}
const myCar = new Car('Toyota', 'Camry');
myCar.info();
When called with new, the constructor's this points to
the new object being created. The new keyword creates a new object
and sets this to reference it.
$ node main.js Toyota Camry
Explicit binding with call and apply
We can explicitly set this using call or apply.
function introduce(lang1, lang2) {
console.log(`My name is ${this.name} and I know ${lang1} and ${lang2}`);
}
const person = { name: 'Alice' };
introduce.call(person, 'JavaScript', 'Python');
introduce.apply(person, ['Ruby', 'Java']);
Both call and apply invoke the function with a specific
this value. The difference is in how arguments are passed. This is
useful for borrowing methods between objects.
$ node main.js My name is Alice and I know JavaScript and Python My name is Alice and I know Ruby and Java
Arrow functions and this
Arrow functions don't have their own this but inherit it from the
enclosing context.
const obj = {
name: 'Bob',
regularFunc: function() {
console.log(this.name);
},
arrowFunc: () => {
console.log(this.name);
}
};
obj.regularFunc(); // 'Bob'
obj.arrowFunc(); // undefined (or window.name in browser)
The arrow function's this comes from its lexical scope (where it's
defined). In this case, it inherits this from the global scope,
not from obj.
$ node main.js Bob undefined
Event handlers and this
In DOM event handlers, this refers to the element that received the
event.
// Assuming this runs in browser with a button element
document.querySelector('button').addEventListener('click', function() {
console.log(this); // the button element
});
// With arrow function
document.querySelector('button').addEventListener('click', () => {
console.log(this); // window (lexical this)
});
Regular functions in event handlers set this to the element. Arrow
functions maintain their lexical this binding. This difference is
important when working with DOM events.
// Output depends on browser environment
Source
In this article we have explored the JavaScript this keyword and its
various contexts. Understanding this is essential for effective
JavaScript programming.