دامنه متغیرها در جاوا اسکریپت

رتبه: 0 ار 0 رای sssss
مقیاس
نویسنده: میلاد حیدری زمان مطالعه 4 دقیقه

در این آموزش با دامنه متغیرها در جاوا اسکریپت (JavaScript) به کمک مثال های مختلف آشنا خواهید شد.

دامنه (Scope) یعنی اینکه متغیرها و توابع در چه قسمت هایی از کد قابل دسترس و استفاده هستند.

در جاوا اسکریپت یک متغیر دو نوع دامنه دارد:

  1. سراسری (Global)
  2. محلی (Local)

دامنه سراسری

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

نمونه ای از یک متغیر سراسری را در مثال زیر می بینیم:

// برنامه چاپ یک متن

let a = “hello”;

function greet () {

console.log(a);

}

greet(); // hello

در این برنامه متغیر a در ابتدای برنامه تعریف شده و یک متغیر سراسری است. یعنی اینکه از متغیر a می توان در هر کجای برنامه استفاده کرد.

مقدار یک متغیر سراسری را می توان در داخل یک تابع تغییر داد. مثال،

// برنامه تغییر مقدار یک متغیر سراسری

let a = “hello”;

function greet() {

a = 3;

}

// قبل از فراخوانی تابع

console.log(a); // hello

// بعد از فراخوانی تابع

greet();

console.log(a); // 3

در این برنامه متغیر a یک متغیر سراسری است که مقدار اولیه آن برابر با hello است. دستور console.log(a) قبل از فراخوانی تابع greet همین مقدار را نمایش می دهد. با فراخوانی تابع greet مقدار متغیر a به مقدار ۳ تغییر می کند و در نهایت دستور console.log(a) بعد از فراخوانی تابع مقدار ۳ را نمایش می دهد.

نکته: بهتر است از به کار بردن متغیرهای سراسری اجتناب کنید چونکه مقدار متغیر در قسمت های مختلف برنامه قابل تغییر است و این می تواند نتایج ناشناخته و غیرقابل پیش بینی به وجود آورد.

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

مثال،

function greet() {

a = “hello”

}

greet();

console.log(a); // hello

در این برنامه متغیر a یک متغیر سراسری است.

اگر متغیر a درون تابع با دستور “let a = “hello تعریف شده بود، برنامه خطا نشان می داد. چون این تعریف متغیر a را به یک متغیر محلی تبدیل می کرد که فقط در درون تابع قابل دسترسی است.

استفاده از متغیر تعریف نشده و مقداردهی نشده نیز منجر به خطا می شود.

نکته: در جاوا اسکریپت strict mode یا “حالت سخت” وجود دارد که قابل تعریف نیز هست. در این حالت بدون تعریف متغیر نمیتوان از آن استفاده کرد.

دامنه محلی

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

مثال ۱: متغیر با محدوده محلی

// برنامه نمایش محدوده محلی یک متغیر

let a = “hello”;

function greet() {

let b = “World”

console.log(a + b); // helloWorld

}

greet();

console.log(a + b); // خطا

خروجی

helloWorld

Uncaught ReferenceError: b is not defined

در این برنامه متغیر a یک متغیر سراسری است و متغیر b یک متغیر محلی برای تابع greet است. متغیر b فقط در داخل تابع قابل دسترسی است و به همین دلیل با استفاده از متغیر b خارج از تابع، خطا در برنامه رخ می دهد.

let محدوده بلوکی دارد

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

مثال ۲: متغیر با محدوده بلوکی

// برنامه نمایش مفهوم محدوده بلوکی

// متغیر سراسری

let a = ‘Hello’;

function greet() {

// متغیر محلی

let b = ‘World’;

console.log(a + ‘ ‘ + b);

if (b == ‘World’) {

// متغیر با محدوده بلوکی

let c = ‘hello’;

console.log(a + ‘ ‘ + b + ‘ ‘ + c);

}

// قابل دسترس نیست c متغیر

console.log(a + ‘ ‘ + b + ‘ ‘ + c);

}

greet();

خروجی

Hello World

Hello World hello

Uncaught ReferenceError: x is not defined

در برنامه بالا متغیر،

  • a یک متغیر سراسری است و در همه جای برنامه قابل دسترسی است.
  • b یک متغیر محلی است و فقط در داخل تابع greet قابل دسترسی است.
  • c یک متغیر با محدوده بلوکی است و فقط در داخل بلوک دستور if قابل دسترسی است.

بنابراین دو دستور console.log() اول بدون هیچ مشکلی کار می کنند.

اما با استفاده از متغیر c در دستور console.log(a + ‘ ‘ + b + ‘ ‘ + c); بعد از بلوک if برنامه خطا می دهد.

نکته: در جاوا اسکریپت var محدوده تابعی (function scoped) دارد و let دارای محدوده بلوکی (block scoped) است. اگر در داخل بلوک دستور if به جای let c = ‘hello’; از کد var c = ‘hello’; استفاده شود، خطای رخ نمی دهد. زیرا تعریف متغیر c با کلمه کلیدی var آن را تبدیل به یک متغیر با محدوده تابعی می کند پس در نتیجه در کل تابع greet قابل دسترس است. ولی خارج از تابع استفاده از متغیر c نیز منجر به خطا می شود.

profile name
میلاد حیدری

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

مطالب پیشنهادی برای شما

محصولات مرتبط

مشاهده همه

دیدگاهتان را بنویسید

1 2 3 4 5

0 نظر درباره «دامنه متغیرها در جاوا اسکریپت»

    هنوز نظری برای این بخش ثبت نشده است
مشاهده همه نظرات
سبد خرید
سبد خرید شما خالی است
× جهت نصب روی دکمه زیر در گوشی کلیک نمائید
آی او اس
سپس در مرحله بعد برروی دکمه "Add To Home Screen" کلیک نمائید