کلیدواژه this در جاوااسکریپت

javascript this keyword guide
20 آبان 1403

در جاوااسکریپت، کلیدواژه this یکی از مفاهیم مهم و گاهی پیچیده است که بسته به شرایط خاص خود رفتار متفاوتی از خود نشان می‌دهد. به طور کلی، this به شیء‌ای اشاره می‌کند که در حال حاضر به آن دسترسی داریم و می‌خواهیم ویژگی‌ها یا متدهای آن را استفاده کنیم. دلیل پیچیدگی این موضوع، روش‌های گوناگون استفاده از this است که به زمینه‌ای که در آن به کار می‌رود، بستگی دارد.

برای مثال، در یک تابع گلوبال یا به‌سادگی در سطح یک اسکریپت، this به شیء window اشاره می‌کند. این بدان معناست که اگر شما در سطح بالا کدی به شکل زیر داشته باشید، this برابر window خواهد بود:

function myFunction() {\r\n    console.log(this);\r\n}\r\nmyFunction();

در کد بالا، console.log(this); خروجی‌ای برابر window در محیط مرورگر خواهد داشت. زمینه‌ای که this در آن استفاده می‌شود، بر اساس نحوه فراخوانی تابع تغییر می‌کند.

حالا بیایید به مثال دیگری بپردازیم: در یک شیء خاص، this به خود آن شیء اشاره می‌کند. زمانی که ما یک متد تعریف می‌کنیم، می‌توانیم this را برای دسترسی به متغیرهای آن شیء استفاده کنیم.

const person = {\r\n    name: 'Ali',\r\n    greet: function() {\r\n        console.log(`Hello, my name is ${this.name}`);\r\n    }\r\n};\r\nperson.greet();

اینجا this.name به Ali اشاره می‌کند و خروجی "Hello, my name is Ali" خواهد بود. این به این دلیل است که greet به عنوان متدی از person فراخوانی شده‌است.

در نهایت، استفاده از this در کلاس‌ها که یکی از ویژگی‌های برجسته ES6 هستند، معمول است. در کلاس‌ها، this در متدهای تعریف شده به شیء خاصی که توسط آن کلاس ساخته شده، اشاره می‌کند. در زیر مثالی از نحوه استفاده از this در کلاس‌ها آمده است:

class Car {\r\n    constructor(make, model) {\r\n        this.make = make;\r\n        this.model = model;\r\n    }\r\n    displayInfo() {\r\n        console.log(`This car is a ${this.make} ${this.model}`);\r\n    }\r\n}\r\nconst myCar = new Car('Toyota', 'Corolla');\r\nmyCar.displayInfo();

کلاس Car شامل یک متد displayInfo است و از this برای دسترسی به ویژگی‌های make و model استفاده می‌کند. نمونه‌گیری از کلاس Car و سپس فراخوانی متد displayInfo خروجی "This car is a Toyota Corolla" خواهد داشت.

توضیح کد خط به خط

function myFunction() { <- تعریف یک تابع در سطح گلوبال
console.log(this); <- چاپ مقدار this که برابر window است
} <- پایان تابع
myFunction(); <- فراخوانی تابع به صورت گلوبال و چاپ window
const person = { <- تعریف یک شیء بنام person
name: 'Ali', <- تعریف یک ویژگی به نام name با مقدار Ali
greet: function() { <- تعریف یک متد به نام greet
console.log(`Hello, my name is ${this.name}`); <- دسترسی به ویژگی name و چاپ نام
} <- پایان متد
}; <- پایان شیء
person.greet(); <- فراخوانی متد greet و چاپ پیغام
class Car { <- تعریف یک کلاس به نام Car
constructor(make, model) { <- تعریف سازنده کلاس
this.make = make; <- انتساب make به this.make
this.model = model; <- انتساب model به this.model
} <- پایان سازنده
displayInfo() { <- تعریف متد displayInfo
console.log(`This car is a ${this.make} ${this.model}`); <- دسترسی به ویژگی‌ها و چاپ اطلاعات
} <- پایان متد
} <- پایان کلاس
const myCar = new Car('Toyota', 'Corolla'); <- ایجاد نمونه‌ای از کلاس Car
myCar.displayInfo(); <- فراخوانی متد displayInfo و نمایش اطلاعات خودرو

سوالات متداول

؟

چرا کلیدواژه this در جاوااسکریپت رفتار متفاوتی دارد؟

؟

چگونه می‌توان از this در یک متد شیء استفاده کرد؟

؟

آیا this در کلاس‌های جاوااسکریپت همانند شیء‌ها رفتار می‌کند؟