آموزش جاوا اسکریپت – فصل بیست و دوم: محدوده (Scope)

در زبان جاوا اسکریپت منظور از scope محدوده هایی است که شما می توانید در آن ها به یک متغیر خاص دسترسی پیدا کنید. متغیر ها از نظر Scope در جاوا اسکریپت می توانند از نوع گلوبال و یا لوکال باشند. متغیر های لوکال فقط در محلی خاص از اسکریپت قابل دسترسی هستند، در حالی که به متغیر های گلوبال در هر مکان از اسکریپت می توان دسترسی پیدا کرد.

جاوا اسکریپت - فصل بیست دوم: محدوده Scope

همان طور که گفته شد، منظور از scope محدوده هایی است که شما می توانید در آن ها به یک متغیر خاص دسترسی پیدا کنید.

مثلا متغیری که درون یک فانکشن تعریف می‌شود فقط درون آن فانکشن قابل استفاده است. یعنی محدوده استفاده یا scope آن متغیر فقط به درون آن فانکشن محدود است.

دو محدوده یا scope در زبان جاوا اسکریپت وجود دارد:

  • محدوده گلوبال
  • محدوده لوکال

محدوده گلوبال (Global Scope)

متغیرهایی که خارج از هرگونه فانکشن تعریف می شوند متغیرهای گلوبال خواهند بود.

متغیرهای گلوبال را درون تمامی فانکشن ها می توان به سادگی به دست آورد و مقدار آنها را تغییر داد.

مثال زیر نشان می‌دهد که یک متغیر گلوبال چگونه در زبان جاوا اسکریپت تعریف می شود:

<script>

    var userName = "Bill";

    function modifyUserName() {
            userName = "Steve";
        };

    function showUserName() {
            alert(userName);
        };

    alert(userName); // display Bill
    
    modifyUserName();
    showUserName();// display Steve

</script>

فصل 22 – مثال 1

در مثال بالا متغیر userName یک متغیر گلوبال است زیرا خارج از هرگونه فانکشنی تعریف شده است.

فانکشن modifyUserName() قادر است تا مقدار این متغیر را به سادگی تغییر دهد زیرا تمامی فانکشن ها می توانند به متغیرهای گلوبال دسترسی پیدا کنند و مقدار آنها را تغییر دهند.

به همین طریق فانکشن showUserName() قادر است تا به مقدار متغیر userName دسترسی پیدا کند.

تغییر مقدار یک متغیر گلوبال باعث تغییر مقدار آن در کل برنامه خواهد شد.

توجه داشته باشید که اگر درون یک فانکشن متغیری را بدون کلمه کلیدی var تعریف کنید آن متغیر تبدیل به یک متغیر گلوبال خواهد شد. مانند مثال زیر:

<script>

    function createUserName() {
        userName = "Bill";
    }

    function modifyUserName() {
        if(userName)
            userName = "Steve";
    };

    function showUserName() {
        alert(userName);  
    }
    
    createUserName();
    showUserName(); // Bill 

    modifyUserName();
    showUserName(); // Steve 

    
</script>

فصل 22 – مثال 2

در مثال بالا متغیر userName بدون کلمه کلیدی var تعریف شده است پس بعد از صدا زدن فانکشن createUserName() یک متغیر گلوبال خواهد بود.

توجه داشته باشید که متغیر userName فقط در صورتیکه فانکشن createUserName() صدا زده شود یک متغیره گلوبال خواهد بود در غیر اینصورت این متغیر وجود نخواهد داشت.

متغیر های محدوده لوکال (Local Scope)

متغیرهای محلی یا Local متغیر هایی هستند که فقط در زیر مجموعه والد خود قابل استفاده هستند و در دیگر فانکشن ها عملاً وجود خارجی ندارند.

درون هر فانکشنی اگر یک متغیر را با کلمه کلیدی var تعریف کنید آن متغیر یک متغیر لوکال خواهد بود و فقط درون آن فانکشن در دسترس است.

مثال زیر نحوه تعریف یک متغیر لوکال در زبان جاوا اسکریپت را نشان می دهد:

<script>
    
    function createUserName() {
        var userName = "Bill";
    }

    function showUserName() {
        alert(userName);
    }

    createUserName();
    showUserName(); // throws error: userName is not defined

</script>

فصل 22 – مثال 3

در مثال بالا متغیر userName برای فانکشن createUserName() یک متغیر لوکال است.

در نتیجه این متغیر نمی‌تواند در فانکشن showUserName() مورد استفاده قرار بگیرد.

اگر تلاش کنید که به یک متغیر که در یک فانکشن به‌صورت لوکال تعریف شده است در فانکشن دیگر دسترسی پیدا کنید سیستم با پیغام خطا مواجه خواهد شد.

در فصل مدیریت خطا بیشتر در مورد این پیغام ها در سیستم صحبت خواهیم کرد.

نکاتی چند در مورد متغیرهای لوکال و گلوبال

اگر متغیر لوکال و گلوبالی با یک نام وجود داشته باشند تغییر مقدار یکی از آنها بر روی دیگری تاثیری نخواهد گذاشت، به مثال زیر توجه کنید:

var userName = "Bill";

function ShowUserName()
{
    var userName = "Steve";

    alert(userName); // "Steve"
}

ShowUserName();

alert(userName); // Bill

فصل 22 – مثال 4

زبان جاوا اسکریپت دارای متغیر لوکال در یک بلاک کد نیست. مثلا درون {} نمی توان یک متغیر اختصاصی برای استفاده درون آن آکولاد تعریف کرد. هر چه تعریف شود برای کل فانکشن لوکال است نه فقط آن بلاک کد.

به مثال زیر توجه کنید، در مثال زیر متغیر myVar تعریف شده در شرط if درون کل فانکشن قابل دسترسی است:

Function NoBlockLevelScope(){
    
    if (1 > 0)
    {
        var myVar = 22;

    }

    alert(myVar);
}

NoBlockLevelScope();

فصل 22 – مثال 5

ویدیوها و مطالب مشابه