this ایک فنکشن کو کیسے کال کیا جاتا ہے اس سے طے ہوتا ہے، نہ کہ یہ کہاں تعریف کیا گیا ہے۔ پانچ اصول ہیں:
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this ایک فنکشن کو کیسے کال کیا جاتا ہے اس سے طے ہوتا ہے، نہ کہ یہ کہاں تعریف کیا گیا ہے۔ پانچ اصول ہیں:
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
Arrow functions کے پاس اپنا this نہیں ہوتا — وہ اسے تعریف کے وقت ارد گرد کے scope سے وراثت میں لیتے ہیں۔ یہی وجہ ہے کہ 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); });
},
};
ایک method کو callback کے طور پر منتقل کرنا اس کی بندش کو کھو دیتا ہے، کیونکہ اس کے بعد یہ سادگی سے کال ہوتا ہے:
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 bugs میں سے ایک ہے۔
حل عام طور پر ایک arrow function یا .bind() ہے تاکہ مطلوبہ this کو محفوظ کیا جا سکے۔