this keyword in various contextsthis?02-28-2023
JavaScriptâs this keyword is a source of confusion for new and experienced developers alike. It can be frustrating if, for some reason, this doesnât point to the context that was intended.
JavaScript's this keyword behaves differently depending on its runtime environment because the global object is different in each environment. In the browser, the global object is 'window', while in Node.js, it is 'global'. Therefore, the this keyword will refer to the global object in each environment.
The "use strict" statement influences what the this keyword points to. In strict mode, the this keyword inside a function will be undefined if the function is called without an explicit this context. In non-strict mode, the this keyword will refer to the global object if the function is called without an explicit this context.
Here are the different ways the this keyword behaves in different contexts:
this is used in the global context, it refers to the global object of the runtime environment.// BROWSER
// "use strict";
console.log(this === window); // true
// NODE REPL
console.log(this === global); // true
However, within a node module we get false. This is because, in the top-level code of a node module, this is equivalent to module.exports, not global.
this keyword refers to the object that the function is called on, or the global object if the function is called without an explicit this context.function greet() {
console.log(this.name);
}
const person = {
name: 'Yire',
greet: greet
};
person.greet(); // Yire
const func = greet;
func(); // undefined in strict mode, Window in non-strict mode
this refers to the instance of the object that is being created.function Person(name) {
this.name = name;
}
const yire = new Person('Yire');
console.log(yire.name); // Yire
this refers to the object that the method is called on.const person = {
name: 'Yire',
greet: function() {
console.log('Hello, my name is ' + this.name);
}
};
person.greet(); // Hello, my name is Yire
Sometimes, you may want to explicitly set the this context for a function call using .call() or .apply(). These methods are used to call a function with a specified this context, as well as arguments.
function greet() {
console.log('Hello, my name is ' + this.name);
}
const person = { name: 'Yire' };
greet.call(person); // Hello, my name is Yire
greet.apply(person); // Hello, my name is Yire
If you want to permanently set the this context for a function, you can use .bind(). This creates a new function with the this context set to the specified object.
function greet() {
console.log('Hello, my name is ' + this.name);
}
const person = { name: 'Yire' };
const boundGreet = greet.bind(person);
boundGreet(); // Hello, my name is Yire
Arrow functions behave differently with the this keyword. They do not have their own this context, and instead use the this value from their enclosing execution context. They should not be used as methods for objects because then this does not work at all.
const person = {
name: 'Yire',
greet: () => {
console.log('Hello, my name is ' + this.name);
}
};
person.greet(); // Hello, my name is undefined
In this example, the arrow function is used inside the forEach() method to log a message to each friend in the friends array. The arrow function captures the this value from its enclosing execution context, which is the person object. Therefore, when the arrow function is called, it uses the this value of person, and logs the correct message for each friend, including the name of the person who is greeting them.
![]()
const person = {
name: 'Yire',
friends: ['Marshal', 'Raymond', 'Sherb'],
greetFriends: function() {
this.friends.forEach(friend => {
console.log(`Hi ${friend}, I'm ${this.name}`);
});
}
};
person.greetFriends();
// Hi Marshal, I'm Yire
// Hi Raymond, I'm Yire
// Hi Sherb, I'm Yire