What is “this” object?
Understanding the ‘this’ Keyword
The this keyword in JavaScript refers to the context in which a function is executed. Its value is determined by how a function is called, not where it is defined.
Key Point: The value of this is determined at runtime based on the execution context. It can refer to different objects depending on how a function is called.
Global Context
‘this’ in the Global Scope
// In browser environment
console.log(this); // Window object (global object in browsers)
// In Node.js environment
console.log(this); // Global object (different from browser)
// Adding property to global object
this.e = 5;
console.log(e); // 5 (in non-strict mode)
console.log(this.e); // 5
console.log(window.e); // 5 (in browser)
Global Context
Window object (browser)
Global object (Node.js)
Global object (Node.js)
Function Context
‘this’ in Regular Functions
// Regular function in global scope
function test() {
console.log(this);
}
test(); // Window object (in browser)
// In strict mode
function strictTest() {
'use strict';
console.log(this);
}
strictTest(); // undefined (in strict mode)
Object Method Context
‘this’ in Object Methods
const obj = {
name: "Test Object",
regularFunction: function() {
console.log(this); // Refers to obj
console.log(this.name); // "Test Object"
},
arrowFunction: () => {
console.log(this); // Refers to global object (Window)
console.log(this.name); // undefined
}
};
obj.regularFunction(); // obj context
obj.arrowFunction(); // global context
Regular Function
Refers to owner object
Arrow Function
Refers to global context
Arrow Functions vs Regular Functions
‘this’ Behavior Comparison
| Feature | Regular Functions | Arrow Functions |
|---|---|---|
this binding |
Dynamic (depends on call context) | Lexical (inherits from parent scope) |
| Use as methods | Good (binds to object) | Poor (binds to global scope) |
| Use as constructors | Yes (with new) |
No (cannot use new) |
arguments object |
Yes | No |
Arrow Functions Lexical ‘this’
const obj = {
name: "Test Object",
regularFunction: function() {
console.log(this.name); // "Test Object"
// Nested regular function
function nestedRegular() {
console.log(this.name); // undefined (global context)
}
nestedRegular();
// Nested arrow function
const nestedArrow = () => {
console.log(this.name); // "Test Object" (inherits from parent)
};
nestedArrow();
}
};
obj.regularFunction();
Controlling ‘this’ with Call, Apply, and Bind
Explicit ‘this’ Binding
const obj1 = { name: "Object 1" };
const obj2 = { name: "Object 2" };
function showName() {
console.log(this.name);
}
// call() - invokes function with specific 'this'
showName.call(obj1); // "Object 1"
// apply() - similar to call() but accepts arguments as array
showName.apply(obj2); // "Object 2"
// bind() - returns a new function with bound 'this'
const boundFunction = showName.bind(obj1);
boundFunction(); // "Object 1"
Event Handler Context
‘this’ in DOM Event Handlers
// HTML: <button id="myBtn">Click me</button>
const button = document.getElementById('myBtn');
// Regular function - 'this' refers to the element
button.addEventListener('click', function() {
console.log(this); // button element
});
// Arrow function - 'this' refers to global object
button.addEventListener('click', () => {
console.log(this); // Window object
});
Constructor Context
‘this’ in Constructors
function Person(name, age) {
// 'this' refers to the new instance
this.name = name;
this.age = age;
this.introduce = function() {
return `Hi, I'm ${this.name} and I'm ${this.age} years old.`;
};
}
// Using 'new' creates a new object with 'this' bound to it
const person1 = new Person("Alice", 30);
console.log(person1.introduce()); // "Hi, I'm Alice and I'm 30 years old."
Common Questions Answered
Why Avoid Arrow Functions for Methods?
const obj = {
name: "Test",
// Regular function - works correctly
regularMethod: function() {
console.log(this.name); // "Test"
},
// Arrow function - doesn't work as expected
arrowMethod: () => {
console.log(this.name); // undefined (refers to global)
}
};
obj.regularMethod(); // Correct
obj.arrowMethod(); // Incorrect
Best Practices
- Use regular functions for object methods to ensure proper
thisbinding - Use arrow functions for callbacks and nested functions where you want to preserve the parent’s
this - Use
call(),apply(), orbind()when you need explicit control overthis - Be cautious with
thisin event handlers – regular functions refer to the element, arrow functions refer to the global object - Consider using modern JavaScript features like classes for more predictable
thisbehavior