۲۵ ژوئیه ۲۰۲۲

شیء گلوبال

شیء گلوبال متغیرها و عملکردهایی را ارائه می‌دهد که در هر‌مکانی در دسترس هستند. به طور پیش‌فرض، مواردی که در زبان یا محیط(environment) ساخته شده اند.

در مرورگر window نام دارد، برای Node.js global است، برای محیط‌های دیگر ممکن است نامی متفاوت داشته باشد.

اخیراً globalThis به عنوان نام استاندارد شده برای یک شیء گلوبال به زبان اضافه شده است که باید در همه محیط‌ها پشتیبانی شود. در همه مرورگرهای اصلی پشتیبانی می‌شود.

ما با فرض اینکه محیط ما یک مرورگر است، از window ‌کنیم. اگر اسکریپت شما ممکن است در محیط‌های دیگر اجرا شود، بهتر است به جای آن از globalThis استفاده کنید.

دسترسی مستقیم به تمام ویژگی‌های شیء گلوبال امکان پذیر است:

alert("سلام");
// یکسان است با
window.alert("سلام");

در مرورگر، توابع و متغیرهای گلوبال تعریف شده با var (نه let/const!) به ویژگی شیء گوبال تبدیل می‌شوند:

var gVar = 5;

alert(window.gVar); // 5 (به یک ویژگی از شیء گلوبال تبدیل شد)

Function declarationها (عبارات دارای کلمه کلیدی function در جریان کد اصلی، نه Function expressionها) نیز همین تأثیر را دارد.

لطفا به آن تکیه نکنید! این رفتار به دلایل سازگاری وجود دارد. اسکریپت‌های مدرن از ماژول‌های جاوا‌اسکریپت در مواردی که چنین چیزی اتفاق نمی‌افتد استفاده می‌کنند.

اگر از let به جای آن استفاده کنیم، چنین اتفاقی نمی‌افتد:

let gLet = 5;

alert(window.gLet); // undefined (به یک ویژگی از شیء گلوبال تبدیل نمی‌شود)

اگر مقدار آنقدر مهم است که می‌خواهید آن را در سطح عمومی در دسترس قرار دهید، آن را مستقیماً به عنوان یک ویژگی بنویسید:

// اطلاعات کاربر فعلی را گلوبال کنید، تا همه اسکریپت‌ها به آن دسترسی داشته باشند
window.currentUser = {
  name: "علی"
};

// جایی دیگر در کد
alert(currentUser.name);  // علی

// یا اگر یک متغیر محلی با نام "currentUser" داریم
// آن را به صراحت از window دریافت کنید (ایمن!)
alert(window.currentUser.name); // علی

با این وجود، استفاده از متغیرهای گلوبال عموماً دلسرد کننده است. باید تا حد ممکن متغیرهای گلوبال وجود داشته باشد. طراحی کد که در آن یک تابع متغیرهای “ورودی” دریافت می‌کند و “نتیجه” خاصی را ایجاد می‌کند، به وضوح، کمتر مستعد خطا می‌شود و آزمایش آن راحت تر از مواردی است که از متغیرهای خارجی یا گلوبال استفاده می‌کنند.

‌استفاده برای پلی‌فیل‌ها