this ਨਿਰਧਾਰਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿਵੇਂ ਇੱਕ ਫੰਕਸ਼ਨ ਨੂੰ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਨਾ ਕਿ ਇਸ ਨੂੰ ਕਿੱਥੇ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਪੰਜ ਨਿਯਮ ਹਨ:
js
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
this ਨਿਰਧਾਰਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ ਕਿਵੇਂ ਇੱਕ ਫੰਕਸ਼ਨ ਨੂੰ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਨਾ ਕਿ ਇਸ ਨੂੰ ਕਿੱਥੇ ਪਰਿਭਾਸ਼ਿਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਪੰਜ ਨਿਯਮ ਹਨ:
obj = {
: ,
() { .; },
};
obj.();
f = obj.;
();
f.(obj);
();
Arrow ਫੰਕਸ਼ਨਾਂ ਦੇ ਕੋਲ ਆਪਣਾ this ਨਹੀਂ ਹੈ — ਉਹ ਪਰਿਭਾਸ਼ਾ ਦੇ ਸਮੇਂ ਆਲੇ-ਦੁਆਲੇ ਦੇ ਸਕੋਪ ਤੋਂ ਉਪਾਰਜਤ ਕਰਦੇ ਹਨ। ਇਹ ਹੈ ਕਿ ਕਿਉਂ 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); });
},
};
ਕਾਲਬੈਕ ਦੇ ਰੂਪ ਵਿੱਚ ਇੱਕ ਵਿਧੀ ਨੂੰ ਪਾਸ ਕਰਨਾ ਆਪਣੀ ਬਾਈਡਿੰਗ ਗੁਆ ਦਿੰਦਾ ਹੈ, ਕਿਉਂਕਿ ਇਹ ਫਿਰ ਸਾਧਾਰਣ ਤਰੀਕੇ ਨਾਲ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ:
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 ਨੂੰ ਲਾਕ ਕਰਨ ਲਈ।