Q26. Explain the concept of this keyword in different contexts.
this কোথায় কীভাবে নির্ধারিত হয় — global, function, method, arrow আর class-এ।
this হলো ফাংশন চালানোর সময় JavaScript নির্ধারণ করে দেওয়া একটি reference — সে আগে থেকে লেখা থাকে না, ডাকার ধরনের উপর নির্ভর করে। তাই একই ফাংশন বিভিন্ন জায়গায় থেকে ডাকলে ভিন্ন this পেতে পারে।
// ১. Global context
console.log(this); // window (ব্রাউজারে)
// ২. সাধারণ function — অ-কঠোর মোডে
function show() {
console.log(this === window); // true
}
show();
// ৩. Method — this হলো সেই object
const user = {
name: "Rahim",
show() {
console.log(this.name); // "Rahim"
},
};
user.show();সবচেয়ে বেশি ভুল হয় যখন method টেনে আনা হয় — তখন this হারিয়ে যায়।
const user = {
name: "Rahim",
show() {
console.log(this.name);
},
};
const fn = user.show;
fn(); // this আর user নয়Arrow function-এর নিজস্ব this নেই — সে লেখার সময়ের বাইরের this ধার করে রাখে, তাই কোথা থেকে ডাকলেও বদলায় না।
const user = {
name: "Rahim",
arrow: () => this.name, // ধার করা this
regular: function () {
return this.name;
},
method: function () {
// ভেতরের arrow টেনে আনার পরেও this ঠিক থাকে
const inner = () => this.name;
return inner();
},
};
console.log(user.method()); // "Rahim"Class-এর ভিতরে this সবসময় কঠোর মোডে কাজ করে, তাই call বা apply ছাড়া বসানো পরিস্থিতিতে সেটি undefined থাকে।
class User {
constructor() {
this.name = "Rahim";
}
show() {
return this.name; // new করে ডাকলে ঠিক থাকে
}
}
const show = new User().show;
// show(); // TypeError: this is undefinedthis সরাসরি ঠিক করতে call, apply বা bind ব্যবহার করা হয়।
function show() {
console.log(this.name);
}
const user = { name: "Rahim", show };
show.call({ name: "Karim" }); // "Karim"
show.apply({ name: "Jamal" }); // "Jamal"
const bound = show.bind({ name: "Rahim" });
bound(); // "Rahim"| Context | this কী হয় |
|---|---|
| Global | window (বা undefined কঠোর মোডে) |
| সাধারণ function | window / globalThis |
| Object method | সেই object |
| Arrow function | লেখার সময়ের বাইরের this |
| Class method | নিজের object, নাহলে undefined |
call / apply / bind | ওগুলোতে দেওয়া object |
this খুব context-নির্ভর, তাই ভুল পথে গেলে চুপচাপ undefined বা ভুল object পাওয়া যায়। ফাংশন পাঠানোর আগে bind করুন, অথবা class method ব্যবহার করুন।