Published by A&A Agency Updated at:

A&a

  Front-endAngularReactUIJavascriptWebsiteAppUXFirebaseHTML 5SASS developers  

Back

What does "this" mean in JavaScript?

First published:

front-end developers
javascript
scopes
javascript tutorial

JavaScript's "this" keyword is often misunderstood by developers, especially when it comes to object-oriented programming. In this article, we will explore the concept of "this" and how the dynamic reference changes in different scopes.

What is this in JavaScript?

In JavaScript, the this keyword refers to the current execution context. It is a special variable that is implicitly defined within every function. The value of this changes depending on how a function is called. For instance, in a global scope, this refers to the window object. In the context of an object method, this refers to the object instance that owns the method.

this in Global Scope

When used in a global context, this refers to the window object. Consider the following example:

console.log(this); // logs the Window object

In this case, this refers to the global scope, which is the window object. It is worth noting that in strict mode, this in global scope is undefined.

this in a Function

In a function, this refers to the global object. Consider the following example:

function greet() { console.log(this); } greet(); // logs the Window object

Here, this is still referring to the global object (window), even though it is inside a function.

this in an Object Method

When used inside an object method, this refers to the object instance that owns the method. Consider the following example:

const person = { name: "John", age: 30, sayHello() { console.log(`Hello, my name is ${this.name}`); }, }; person.sayHello(); // logs "Hello, my name is John"

In this example, this refers to the person object because it is the object that owns the sayHello method. Therefore, this.name refers to the name property of the "persn object.

this in an Event Listener

When used in an event listener, this refers to the element that fired the event. Consider the following example:

const button = document.querySelector("button"); button.addEventListener("click", function () { console.log(this); // logs the button element });

Here, this refers to the button element because it is the element that fired the click event.

this in Arrow Functions

Arrow functions do not have their own this value. Instead, they inherit the this value from their lexical scope. Consider the following example:

const person = { name: "John", age: 30, sayHello: () => { console.log(`Hello, my name is ${this.name}`); }, }; person.sayHello(); // logs "Hello, my name is undefined"

In this case, this is not referring to the person object because arrow functions do not have their own this value. Instead, this is inherited from the lexical scope, which is the global scope. Therefore, this.name is undefined because there is no name property in the global scope.

How does the value of this change in a call(), apply(), or bind() method?

JavaScript provides three methods – call, apply, and bind – to change the this value in a function. The call and apply methods allow us to call a function with a specific this value, while the bind method creates a new function with a specific this value. Let's explore these methods in more detail.

call()

The call method allows us to call a function with a specific this value and arguments passed individually. The first argument to the call method is the value to which this should be set, and subsequent arguments are the arguments to the function being called. Consider the following example:

function greet() { console.log(`Hello, my name is ${this.name}`); } const person = { name: "John", age: 30, }; greet.call(person); // logs "Hello, my name is John"

In this example, the call method is used to set the this value of the greet function to the person object. Therefore, this.name refers to the name property of the person object.

apply()

The apply method is similar to the call method, but it accepts an array of arguments instead of individual arguments. Consider the following example:

function addNumbers(a, b, c) { console.log(a + b + c); } const numbers = [1, 2, 3]; addNumbers.apply(null, numbers); // logs 6

In this example, the apply method is used to call the addNumbers function with the this value set to null and the arguments passed in the numbers array.

bind()

The bind method creates a new function with a specific this value. It does not immediately call the function, but instead returns a new function that can be called later. Consider the following example:

const person = { name: "John", age: 30, sayHello() { console.log(`Hello, my name is ${this.name}`); }, }; const greet = person.sayHello.bind(person); greet(); // logs "Hello, my name is John"

In this example, the bind method is used to create a new function called greet with the this value set to the person object. The greet function is then called, which logs "Hello, my name is John".

Conclusion

The behavior of the this keyword in JavaScript can be confusing, but it is an essential concept to understand when working with object-oriented programming in JavaScript. The value of this changes depending on how a function is called, and it can be set using the call, apply, and bind methods. Understanding this is crucial for writing maintainable and bug-free code.

To summarize, this in JavaScript refers to the current execution context. In the global scope, this refers to the window object. In a function, this refers to the global object. In an object method, this refers to the object instance that owns the method. In an event listener, this refers to the element that fired the event. Arrow functions do not have their own this value but inherit it from their lexical scope. The call, apply, and bind methods allow us to set the this value of a function.

By understanding how this works in different scenarios, we can write more robust and maintainable code in JavaScript. Although it can be a tricky concept to grasp initially, with practice and experience, developers can master the behavior of this in JavaScript.