۲۵ ژوئیه ۲۰۲۲

شیء گلوبال

شیء گلوبال متغیرها و عملکردهایی را ارائه می‌دهد که در هر‌مکانی در دسترس هستند. به طور پیش‌فرض، مواردی که در زبان یا محیط(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); // علی

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

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

ما از شیء گلوبال برای آزمایش پشتیبانی از ویژگی‌های مدرن زبان استفاده می‌کنیم.

به عنوان مثال، آزمایش اینکه آیا یک شیء Promise وجود دارد (در مرورگرهای قدیمی واقعاً وجود ندارد):

if (!window.Promise) {
  alert("مرورگر شما واقعا قدیمی است!");
}

اگر هیچ کدام وجود نداشت (به عنوان مثال، ما در یک مرورگر قدیمی هستیم)، می‌توانیم “polyfills” ایجاد کنیم: اضافه کردن توابعی که توسط محیط پشتیبانی نمی‌شوند، اما در استاندارد مدرن وجود دارند.

if (!window.Promise) {
  window.Promise = ... // پیاده سازی سفارشی ویژگی مدرن زبان
}

خلاصه

  • شیء گلوبال متغیرهایی را نگه می‌دارد که باید در همه‌جا در دسترس باشند.

    این شامل پیشفرض‌های جاوا‌اسکریپت، مانند Array و مقادیر خاص محیط، مانندwindow.innerHeight– ارتفاع پنجره در مرورگر است.

  • شیء گلوبال دارای نام عمومی globalThis است.

    … اما بیشتر اوقات با نام‌های خاص محیط قدیمی “old-school” ،مانند window (مرورگر) و global (Node.js) نامیده می‌شود.

  • ما باید مقادیر را در شیء گلوبال تنها در صورتی ذخیره کنیم که واقعاً برای پروژه‌ما عمومی باشد. و تعداد آنها را به حداقل برسانیم.

  • در مرورگر، مگر اینکه از ماژول‌ها استفاده کنیم، توابع و متغیرهای عمومی اعلام شده با var به یک ویژگی شیء گلوبال تبدیل می‌شوند.

  • برای اینکه کد ما در آینده ایمن و قابل فهم باشد، باید مستقیماً به خواص شیء گلوبال به عنوان window.x دسترسی پیدا کنیم.

نقشه آموزش