this নির্ধারিত হয় একটি ফাংশন কীভাবে CALLED হয় তার উপর ভিত্তি করে, এটি যেখানে সংজ্ঞায়িত হয় তার উপর নয়। পাঁচটি নিয়ম রয়েছে:
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this নির্ধারিত হয় একটি ফাংশন কীভাবে CALLED হয় তার উপর ভিত্তি করে, এটি যেখানে সংজ্ঞায়িত হয় তার উপর নয়। পাঁচটি নিয়ম রয়েছে:
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
Arrow ফাংশনের নিজস্ব this নেই — এটি সংজ্ঞায়িত সময়ে enclosing scope থেকে inherit করে। এই কারণেই arrows callbacks এর জন্য নিখুঁত:
const obj = {
items: [1, 2],
logAll() {
// ✅ arrow inherits `this` from logAll → `this` is obj
this.items.forEach(i => console.log(this.items, i));
// ❌ a regular function here would have its own `this` (undefined) → crash
// this.items.forEach(function (i) { console.log(this.items); });
},
};
একটি মেথডকে callback হিসাবে পাস করা এর binding হারায়, কারণ তখন এটি সাধারণভাবে called হয়:
button.addEventListener("click", obj.getX); // ❌ `this` is the button
button.addEventListener("click", () => obj.getX()); // ✅ keeps obj
button.addEventListener("click", obj.getX.bind(obj)); // ✅ also fine
this ভুল বোঝা সবচেয়ে সাধারণ JS বাগ।
ফিক্সটি সাধারণত একটি arrow ফাংশন বা .bind() যাতে উদ্দেশ্যমূলক this লক হয়।