this in Functions
کلمه کلیدی this
در جاوااسکریپت به شیئی که تابع در زمان اجرا به آن تعلق دارد اشاره میکنه.
اما مقدار this
بستگی به نحوه فراخوانی تابع (Invocation) داره.
1️⃣ this
در یک تابع معمولی (Global Function)
در حالت strict mode → مقدار this
برابر undefined
در حالت عادی → مقدار this
برابر window
(در مرورگر) یا global
(در Node.js)
2️⃣ this
در یک متد (Method in Object)
وقتی تابع داخل یک شیء صدا زده میشه → this
به همون شیء اشاره میکنه.
3️⃣ this
در توابع تو در تو (Nested Functions)
توابع داخلی به صورت پیشفرض this
رو از والد به ارث نمیبرن.
📌 راهحل → استفاده از Arrow Function یا bind:
4️⃣ this
در Constructor Function
وقتی تابع با new
صدا زده بشه → this
به شیء جدید ساخته شده اشاره میکنه.
5️⃣ this
در Arrow Function
Arrow function مقدار this
رو از محیط بیرونی (lexical scope) به ارث میبره و دیگه تغییر نمیکنه.
📌 پس برای متدها بهتره از function معمولی استفاده کنیم.
6️⃣ this
با call, apply, bind
-
call
→ فراخوانی تابع با تغییرthis
و ارسال آرگومانها جدا جدا -
apply
→ مثل call ولی آرگومانها در قالب آرایه -
bind
→ یک نسخه جدید از تابع میسازه کهthis
به شیء مورد نظر قفل شده
📌 خلاصه مهم
-
تابع معمولی → this = window/global (یا undefined در strict)
-
متد شیء → this = همان شیء
-
توابع تو در تو → this از دست میره (مگر با arrow function یا bind)
-
سازنده (new) → this = شیء جدید
-
arrow function → this از محیط بیرونی میاد (lexical this)
-
call/apply/bind → کنترل دستی this