Scope در جاوا اسکریپت چیست؟ – توضیح به زبان ساده + مثال و کد
Scope در جاوا اسکریپت مفهومی اساسی است که دسترسی یا قابل مشاهده بودن متغیرها، اشیا و توابع را تعیین میکند. در واقع به وسیله Scope در JavaScript میتوان محدودهای از کدها را تعیین کرد که در آن به متغیر یا تابع دسترسی داریم. ۲ نوع اصلی Scope در زبان برنامه نویسی جاوا اسکریپت وجود دارند که هر کدام از آنها کاربردهای خاص خودشان را دارند. در این مطلب از «مجله فرادرس»، بحث Scope در جاوا اسکریپت و انواع آن به همراه مثالهایی با زبان ساده آموزش داده خواهد شد.
- خواهید توانست تفاوت انواع scope جاوا اسکریپت را مشخص کنید.
- یاد میگیرید نحوه تعریف متغیر و تابع را بر دامنهشان منطبق سازید.
- با ریسکها و نکات کاربردی متغیرهای سراسری و محلی آشنا میشوید.
- خواهید آموخت تفاوتهای عملی var، let و const در scope چیست.
- از خطاهای رایج دسترسی متغیر در scopeهای مختلف پیشگیری میکنید.
- میآموزید با انتخاب صحیح scope امنیت و خوانایی کد را افزایش دهید.


Scope در جاوا اسکریپت چیست؟
در محیط جاوا اسکریپت، «Scope» به معنای دامنه (محدوده) کدهای کاربر است. این دامنه به عنوان نوعی تعیین کننده دسترسی به توابع و متغیرها در جاوا اسکریپت عمل میکند. به عبارت سادهتر، تصمیم کاربر در مورد مکان اعلان تابع یا متغیر در جاوا اسکریپت، متعاقباً بر دسترسی آن تأثیر میگذارد. از این رو، وقتی متغیری در تابعی اعلان میشود، تنها در محدوده آن تابع قابل دسترسی است.
- نکته: منظور از کلمات «محدوده» و «دامنه» در این بحث یکسان است. همچنین کلمات «محدوده سراسری» و «محدوده جهانی» نیز مترادف هستند.
انواع Scope در جاوا اسکریپت
اصطلاح Scope در جاوا اسکریپت به معنای دسترسی به متغیرها و توابع در بخشهای خاصی از کدها است. در دنیای برنامه نویسی جاوا اسکریپت، محدوده متغیرها به چند دسته زیر تقسیم میشود:
- «محدوده سراسری» (Global Scope)
- «اسکوپ محلی» (Local Scope)
- «محدوده تابع» (Function Scope)
- «اسکوپ بلوک» (Block Scope)
- «محدوده واژگانی» (Lexical Scope)
در ادامه این آموزش Scope در جاوا اسکریپت، تمامی محدودههای نام برده به همراه مثال آموزش داده خواهند شد.

محدوده سراسری در جاوا اسکریپت چیست؟
متغیرهایی که در ابتدای برنامه اعلان میشوند یا آنهایی که در تابعی محصور نشدهاند، در «محدوده سراسری | جهانی» (Global Scope) قرار میگیرند. اصطلاح Scope در جاوا اسکریپت نشان میدهد که آیا متغیر یا تابع میتواند از قسمتهای مختلف کدها قابل دسترسی باشد یا خیر.
محدوده پیشفرض برای متغیرها و توابع در جاوا اسکریپت، محدوده سراسری است. برای نشان دادن این موضوع، توجه به مثال زیر اهمیت زیادی دارد.
در قطعه کد داده شده، متغیری به نام companion تعریف شده است. همچنین مقدار dog به این متغیر اختصاص دارد. همچنین تابعی به نام displayCompanion اعلان شده که مقدار companionرا در کنسول ثبت میکند. از آنجایی که companionنوعی متغیر سراسری است، میتوان در تابعdisplayCompanionبه آن دسترسی ایجاد کرد. به طور مشابه، میتوان به companionدر خارج از تابع دسترسی داشت که خروجی آن به صورت زیر خواهد بود.
با این حال، اگر کاربر سعی داشته باشد به متغیری دسترسی پیدا کند که در محدوده جهانی تعریف نشده است، با خطا مواجه خواهد شد.
در کدهای بالا، متغیری به نامcompanionوجود دارد که مقدار cat به آن اختصاص داده شده است و تابعی به نام displayCompanionوجود دارد که companionرا ثبت میکند. با این حال، otherCompanion در محدوده جهانی تعریف نشده و بنابراین دسترسی آن خارج از تابع displayCompanionتعریف نشده خواهد بود.
چند مثال از Global Scope در جاوا اسکریپت
در جاوا اسکریپت، زمانی که متغیری در ابتدای «اسکریپت» (Script) یا خارج از هر تابعی اعلان میشود، به عنوان متغیر سراسری در نظر گرفته خواهد شد، به این معنی که میتوان به آن دسترسی داشت و در هر جایی از برنامه از آن استفاده کرد.
در ادامه این مطلب از مجله فرادرس چند مثال دیگر برای این نوع محدوده در جاوا اسکریپت آورده شده که مثال اول به صورت زیر است:
در اسکریپت بالا، greeting همانطور که در سطح بالای برنامه اعلان شده، نوعی متغییر سراسری محسوب میشود و حتی در تابع sayHello قابل دسترسی خواهد بود. توجه به این نکته مهم است که مقدار متغیر سراسری را میتوان در تابع تغییر داد. مثال زیر این موضوع را بیان میکند.
در کدهای بالا، greetingنوعی متغیر سراسری به حساب میآید که به صورت hello مقداردهی شده است. با این حال، در تابع changeGreeting ، مقدار آن به 3 تغییر میکند و این تغییر زمانی که greetingپس از آن ثبت میشود، منعکس خواهد شد.
نکته حائز اهمیت در اینجا این است که تکیه بر متغیرهای سراسری باید به حداقل برسد، زیرا مقادیر آنها را میتوان در مکانهای مختلف در برنامه تغییر داد که این کار به طور بالقوه منجر به بروز نتایج غیرقابل پیشبینی میشود. جالب اینجاست که در جاوا اسکریپت، متغیر را میتوان بدون اعلان صریح در ابتدا باز هم استفاده کرد. اگر این اتفاق بیفتد، متغیر به طور خودکار دامنه سراسری پیدا میکند. مثال زیر برای بیان این موضوع ارائه شده است.
در این مورد، greetingنوعی متغیر جهانی محسوب میشود، حتی اگر به صراحت اعلان نشده باشد. اگر متغیر با let greeting = "hello" اعلان شود، برنامه خطا ایجاد میکند. باید به این نکته توجه داشت که جاوا اسکریپت نوعی «حالت سخت گیرانه» (Strict Mode) ارائه میدهد که در آن متغیر نمیتواند بدون اعلان اولیه استفاده شود.
محدوده محلی در جاوا اسکریپت چیست ؟
مفهوم «محدوده یا دامنه محلی» (Local Scope) به متغیر یا تابعی اشاره دارد که فقط در بلوک کد فعلی آن قابل دسترسی است.
میتوان با استفاده از {} محدوده محلی ایجاد کرد که مثال زیر این مفهوم را بیان میکند:
در قطعه بالا، companion مقدار cat را با محدوده محلی ایجاد شده به وسیله {}اختصاص داده است. با این حال، خارج از{}نمیتوان به companionدسترسی پیدا کرد، اما در همان محدوده، قابل دسترسی خواهد بود.
مثالی برای Scope محلی در جاوا اسکریپت
در این بخش مثالی برای Scope در جاوا اسکریپت از نوع محلی ارائه میشود. همانطور که گفته شد، متغیر میتواند دارای محدوده محلی باشد، به این معنی که دسترسی به آن فقط به تابعی خاص محدود میشود. مثال زیر برای درک بهتر این مسئله آورده شده است.
در قطعه کد بالا، متغیر a نوعی متغیر سراسری در نظر گرفته میشود، در حالی که متغیر b متغیری محلی است. دسترسی به متغیر bبه تابع greet محدود شده است. در نتیجه، زمانی که تلاشی برای دسترسی به متغیر bخارج از تابع آن انجام میشود، خطایی ایجاد خواهد شد.

- نکته: همانطور که در تصویر بالا معلوم است، محدوده محلی، خود میتواند شامل ۳ نوع محدوه تابع، محدوه بلوک و محدوده «ماژول» (Module) باشد.
محدوه تابع در جاوا اسکریپت چیست؟
یکی دیگر از انواع Scope در جاوا اسکریپت، «محدوده تابع» (Function Scope) است که محدوده محلی را با تفاوتی کوچک منعکس میکند. در این نوع محدوده، متغیرها و توابعِ تعریف شده در داخل تابع را نمیتوان به صورت سراسری در دسترس قرار داد.
مثال زیر برای درک این نوع محدوده در جاوا اسکریپت مهم است.
در مثال فوق، companionدر displayCompanion تعریف شده است، از این رو فقط در داخل تابع قابل دسترسی خواهد بود و خارج از تابع، غیر قابل دسترسی است.
محدوده بلوک در جاوا اسکریپت
نوعی دیگری از Scope در جاوا اسکریپت، نوع بلوکی آن یا «محدوده بلوکی» (Block Scope) است. محدوده بلوک کاربر را قادر میسازد تا متغیرها و توابع را منحصراً برای بلوک کد خاصی (هر بخش محصور در {} ) تعریف کند.
میتوان با استفاده از کلمات کلیدی let یا const محدوده بلوکی ایجاد کرد. مثال زیر برای درک این مفهوم ضروری است.
در قطعه بالا، از let برای تعریف companionدر عبارت if استفاده شده و نوعی محدوده بلوک ایجاد شده است. خارج از بلوک کد سراسری، companionغیر قابل دسترسی باقی میماند:
- نکته: برای متغیرهای Block Scope در جاوا اسکریپت، محدودهای ایجاد نمیشود.
مثال Block Scope در جاوا اسکریپت
همانطور که بیان شد، کلمه کلیدی letدر جاوا اسکریپت نوعی متغیر با محدوده بلوکی تعریف میکند، به این معنی که متغیر فقط در بلوکی که در آن اعلان شده، قابل دسترسی است.
مثال زیر برای نشان دادن مفهوم محدوده بلوکی برای درک بهتر این موضوع اهمیت زیادی دارد.
خروجی کدهای بالا به صورت زیر است:
Hello World
Hello World hello
Uncaught ReferenceError: c is not defined- a متغیری سراسری بوده و در هر جایی از برنامه قابل دسترسی است.
- b متغیری محلی بوده که فقط در داخل تابع greet قابل دسترسی است.
- c متغیری با محدوده بلوک بوده که فقط در بلوک دستورifقابل دسترسی است.
در برنامه فوق، ۲ اجرای اول console.log() بدون مشکل اجرا میشوند. با این حال، در سومین فراخوانی console.log()سعی میشود به متغیر cبا محدوده بلوک در خارج از بلوک آن دسترسی پیدا شود که منجر به خطا خواهد شد.

توجه به این نکته مهم است که در جاوا اسکریپت، در حالی که var دارای محدوده تابعی است، let محدوده بلوکی دارد. اگر let c = 'hello' با var c = 'hello' در عبارت ifجایگزین شود، در نتیجه برنامه با موفقیت اجرا خواهد شد. زیرا cبه عنوان نوعی متغیر محلی در نظر گرفته میشود.
محدوده واژگانی در جاوا اسکریپت
یکی دیگر از انواع Scope در جاوا اسکریپت، «محدوده واژگانی» (Lexical Scope) است. محدوده یا دامنه واژگانی، که همچنین به عنوان «محدوده ایستا» (Static Scope) یا «محدوده کامپایل-زمان» (Compile-Time Scope) نیز شناخته میشود، مفهوم پیچیدهتری است.
این محدوده به وسیله مکان متغیری در کد تعیین میشود، به این معنی که متغیرها در محدوده مشابه متغیرهای والد قابل دسترسی هستند. مثال زیر این مفهوم را بیان میکند.
در مثال فوق، companionدر محدوده سراسری تعریف شده و در displayCompanion قابل دسترسی است. اما در بلوک کد، companionقابل دسترسی نیست:
در قطعه کد فوق، companionبا استفاده از "varدر داخل عبارت ifتعریف شده و خارج از بلوک کد غیر قابل دسترسی است:
سخن پایانی
مفهوم scope در جاوا اسکریپت بحثی اساسی به حساب میآید که دسترسی به متغیرها و توابع را دیکته میکند. قوانین scope به طور یکنواخت برای متغیرهای const و let اعمال میشود، خواه آنها در بلوکی از کدها، تابع یا ماژولی خاص قرار بگیرند. در مقابل، متغیرهای var تنها زمانی از این قوانین پیروی میکنند که در تابع یا ماژولی قرار گیرند.
استفاده مناسب از Scope در جاوا اسکریپت مزایای مختلفی از جمله افزایش امنیت و پتانسیل استفاده مجدد از کدها را ارائه میدهد. در این مطلب از مجله فرادرس بحث Scope در Javascript به صورت نسبتاً کامل بحث شد و انواع این Scopeها به همراه مثالهایی با زبان ساده بحث شدند.












