this

کلمه کلیدی this یکی از مفاهیم مهم و گاهی گیج‌کننده در جاوااسکریپت است.
this به شیئی اشاره می‌کند که در حال حاضر کد درون آن اجرا می‌شود.

1️⃣ this در یک شیء ساده

وقتی متدی داخل یک شیء تعریف می‌کنیم، this به همان شیء اشاره می‌کند.

const person = { name: "Ali", age: 30, greet: function() { return "سلام، من " + this.name + " هستم."; } }; console.log(person.greet()); // سلام، من Ali هستم.

🔹 در اینجا this.name → به property name شیء person اشاره دارد.

2️⃣ this در خارج از شیء

وقتی در Global Scope (بیرون از هر شیء) از this استفاده کنیم:

  • در مرورگر → به شیء window اشاره دارد.

  • در Node.js → به شیء global اشاره دارد.

console.log(this); // در مرورگر → window // در Node.js → {}

3️⃣ this در Function عادی

اگر تابع به‌صورت عادی فراخوانی شود (نه به عنوان متد شیء)، مقدار this برابر با undefined (در strict mode) یا window (در حالت معمولی) است.

function myFunction() { console.log(this); } myFunction(); // در strict mode → undefined // در حالت عادی → window

4️⃣ this در Method یک شیء

اگر تابع به عنوان متد شیء فراخوانی شود، this به همان شیء اشاره می‌کند:

const car = { brand: "BMW", getBrand: function() { return this.brand; } }; console.log(car.getBrand()); // BMW

5️⃣ this و Constructor Functions

در توابع سازنده (Constructor Functions)، this به شیء جدیدی که ساخته می‌شود اشاره دارد:

function Person(name) { this.name = name; } const p1 = new Person("Sara"); console.log(p1.name); // Sara

6️⃣ this در Arrow Functions

⚡ تفاوت مهم: در Arrow Function مقدار this به محیط بیرونی خودش (lexical scope) بستگی دارد و تغییر نمی‌کند.

const person = { name: "Ali", greet: () => { console.log(this.name); } }; person.greet(); // undefined (در مرورگر → this به window اشاره دارد)

🔹 یعنی arrow function‌ها this مخصوص خودشان ندارند و از context بیرونی استفاده می‌کنند.

7️⃣ استفاده از call(), apply(), bind()

می‌توانیم به‌طور دستی مقدار this را تغییر دهیم:

function greet() { console.log("سلام " + this.name); } const user = { name: "Sara" }; greet.call(user); // سلام Sara greet.apply(user); // سلام Sara const boundGreet = greet.bind(user); boundGreet(); // سلام Sara

📑 جدول خلاصه

موقعیتمقدار this
در شیء (متد)به همان شیء اشاره دارد
در تابع عادی (strict mode)undefined
در تابع عادی (غیر strict mode)window (در مرورگر)
در Constructor Functionشیء جدید ساخته‌شده
در Global Scopewindow (مرورگر) یا global (Node.js)
در Arrow Functionمقدار this از scope بیرونی گرفته می‌شود
با call/apply/bindمقدار this به صورت دستی تعیین می‌شود