چگونه در زبان برنامه نویسی جاوا اسکریپت یک متغیر بسازیم؟


دستور ایجاد یک متغیر، در هر جایی که اتفاق بیافتد، پیش از هر کد دیگری اجرا می شود. محدوده ی اجرا و اعتبار یک متغیر که با کلمه ی کلیدی var تعریف می شود، درون Scope (اسکوپ) یا محدوده ی اجرایی خودش است که می تواند یک فانکشن، لوپ، شرط و... باشد. به این نوع متغیرها که درون یک محدوده ی اجرایی خاص تعریف و استفاده می شوند، اصطلاحاً متغیرهای Local (لوکال) یا محلی گفته می شود.

از طرفی، گروه دیگری از متغیرها که با کلمه ی کلیدی var تعریف می شوند، درون محدوده ی اجرایی خاص و یا یک تکه کد قرار نمی گیرند، بلکه به صورت آزادانه و در بالاترین سطح کد تعریف می شوند. از این متغیرها می توان در تمام برنامه و در تمام فانکشن ها و کدهای دیگر نیز استفاده کرد چرا که این متغیرها نقش متغیرهای عمومی را دارند. این نوع متغیرها را اصطلاحاً Global (گِلوبال) یا عمومی می نامیم.

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

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

SAT = 8
var SAT;

//...
// In your parser, this code is understood as:

var SAT;
SAT = 8;

البته فراموش نکنیم که در صورت عدم استفاده از کلمه ی var در ساخت متغیر، این متغیر به طور گِلوبال شناخته خواهد شد. با این حال، همواره بهتر است تا متغیرهای مورد نیاز خود را در ابتدای برنامه و یا فانکشن آن ها تعریف کنیم تا متوجه شویم که کدامیک لوکال و کدامیک گِلوبال هستند. همچنین، بدین ترتیب می توان متغیرها را ردیابی کرده و تغییرات اعمال شده روی آن ها را نیز آسان تر بررسی نمود.

با این تفاسیر، تقریباً هیچ دلیلی برای استفاده نکردن از کلمه ی کلیدی "var" به هنگام ساخت یک متغیر وجود ندارد و اگر از این کلمه ی کلیدی استفاده نکنید، با مشکل مواجه خواهید شد. اگر از var به هنگام ساخت متغیرها استفاده نکنید، این طور به نظر می رسد که آن را فراموش کرده اید و این کار نه تنها برای برنامه ی شما بلکه برای اعتبار برنامه نویسی شما نیز مشکل ساز خواهد بود پس این کار را نکنید!

مثالی که در پایین آورده ایم، نشان می دهد که عدم استفاده از var برای ساخت متغیر چه پیامدهایی می تواند داشته باشد. همچنین، در این مثال از یک ابزار برنامه نویسی پیشرفته تر به نام function (فانکشن) یا تابع استفاده کرده ایم که در فصل های آینده به طور مفصل آن را بررسی خواهیم کرد. به طور خلاصه، فانکشن ها به شما اجازه می دهند تا برنامه های کوچکی را در درون برنامه ی اصلی خود ایجاد کنید.

در نمونه ی اول، برنامه نویس ما می خواهد متغیری به نام "movie" به معنی فیلم ایجاد کند که یک متغیر گِلوبال است. او همچنین یک متغیر دیگر با همین نام در درون فانکشن "showBadMovie" می سازد. این یک کار کاملاً عادی در دنیای برنامه نویسی است و در شرایط نرمال، متغیر movie درون فانکشن، تداخلی با متغیری که در خارج از فانکشن و با همان نام ایجاد شده، نخواهد داشت اما همان طور که حدس زده اید، شرایط در اینجا نرمال نیست! اگر در زمان تعریف متغیر movie درون فانکشن showBadMovie فراموش کنید که از کلمه کلیدی var استفاده کنید، اتفاقات بدی رخ می دهد:

var movie = "The Godfather";
function showGoodMovie () {
    alert (movie + " is a good movie!");
}

function showBadMovie () {
    movie = "Fantastic 4";
    alert (movie + " is a bad movie!");
}

دقت کنید که کلمه ی کلیدی var در فانکشن دوم (showBadMovie) جا افتاده و متغیر movie در این فانکشن بدون هیچگونه کلمه کلیدی تعریف شده است. در این شرایط، موتور مفسر زبان جاوا اسکریپت تصور می کند که شما می خواهید متغیر گِلوبال movie که در بالاتر و خارج از فانکشن ها تعریف شده است را مورد هدف قرار دهید. همان طور که انتظار می رود، نتیجه ی نهایی یک فاجعه است. برای مشاهده ی این فاجعه، فانکشن هایی که پیش از این تعریف کرده ایم را اصطلاحا Call می کنیم یا «فرا می خوانیم» تا نتیجه را بهتر متوجه شویم. برای کال کردن یک فانکشن در زبان برنامه نویسی جاوا اسکریپت، نام فانکشن مد نظر را نوشته، یک جفت پرانتز مقابل آن قرار داده و در نهایت یک علامت ; مقابل آن قرار می دهیم:

showGoodMovie ();  // pops up "The Godfather is a good movie!"
showBadMovie ();  // pops up "Fantastic 4 is a bad movie!"
/* Oh no! The global variable value is now "Fantastic 4" and not the good movie anymore! */
showGoodMovie ();	 // pops up "Fantastic 4 is a good movie!"

در اجرای اول و دوم، همه چیز به خوبی پیش می رود و نتیجه دقیقاً همانند انتظار چاپ می شود اما در تابع دوم یعنی ()showBadMovie مقدار متغیر movie با مقدار "Fantastic 4" تغییر پیدا می کند و به همین دلیل زمانی که برای دومین بار فانکشن ()showGoodMovie را صدا می زنیم، با پیغامی اشتباه مواجه می شویم.

نکته
به طور کلی، بهتر است از متغیرهای لوکال (محلی) به جای متغیرهای گِلوبال استفاده کنیم. هر چه محدوده ی متغیر خود را محدود تر کنیم، شانس آن که با ساختن یک متغیر گِلوبال، تغییرات ناخواسته ای در یک متغیر دیگر ایجاد کنیم، کمتر خواهد شد. استفاده از متغیرهای گِلوبال می تواند مشکلاتی برای ما درست کند که ردیابی و حل آن ها سخت خواهد بود. به همین خاطر پیشنهاد می کنیم که تا حد امکان، از متغیرهای گِلوبال پرهیز کرده و متغیرهای خود را با کلمه ی کلیدی var بسازید. حتی اگر زمانی به متغیرهای گِلوبال احتیاج پیدا کردید، می توانید آن ها را هم با var ایجاد کنید و توصیه می شود که حتماً این کار را بکنید!

نامگذاری متغیرها
نام هر متغیر می تواند به سه روش شروع شود:
- حروف بزرگ و یا کوچک انگلیسی و اعداد
- یک Underscore (آندراِسکور) که بدین شکل است ( _ )
- علامت دلار ($)

با آن که می توان از علامت دلار و آندراِسکور برای نامگذاری متغیرها استفاده کرد، اما بهتر است از حروف انگلیسی استفاده کنید. کاراکترهای پیچیده و نامعمول می توانند خواندن کد شما را سخت و دشوار کند، مخصوصاً اگر با برنامه نویسی به زبان جاوا اسکریپت آشنا نباشید.

بعد از اولین کاراکتر، می توانید از هر حرف و یا عدد برای اسم متغیر خود استفاده کنید و نام متغیر نیز می تواند به میزان دلخواه، طولانی باشد. البته نام متغیرهای جاوا اسکریپت نمی تواند شامل فاصله، عملگرهای ریاضی و یا علامت های نگارشی (به جز آندراِسکور) باشد. علاوه بر این، تحت هیچ عنوان از اسامی رزرو شده در خود زبان جاوا اسکرپیت -مثلا var, function و غیره- برای نامگذاری متغیرها استفاده نمایید.

هشدار
همیشه یادتان باشد که زبان جاوا اسکریپت به بزرگی و کوچکی حروف حساس است. متغیری به نام myname با متغیرهای Myname و myName کاملاً متفاوت است.

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

البته معلوم است که محدودیتی نیز برای طولانی بودن نام متغیر وجود دارد. اگر استفاده از یک نام 20 کاراکتری می تواند دقیقاً کاربرد متغیر شما را توضیح دهد، حتماً آن را انتخاب کنید. اما اگر می خواهید نامی مثل nameOfPersonWhoJustFilledOutTheFormOnMyWebsite را ایجاد کنید، بهتر است کمی صبر کنید و بیاندیشید که آیا می شود با انتخاب نامی ساده تر، زندگی خود (و هر شخص دیگری که قرار است با کد شما کار کند) را ساده تر کنید؟ مثلاً در این مورد می توان از نام personName هم استفاده کرد.

چگونه متغیرها را نامگذاری کنیم؟
با آن که جاوا اسکریپت در انتخاب نام متغیرها، آزادی عمل زیادی در اختیار ما می گذارد، اما بهتر است پیش از شروع، از میان برخی قواعد پایه، یکی را انتخاب کنید. برای نمونه، آیا می خواهید نام های خود را با حروف بزرگ شروع کنید یا حروف کوچک؟ آیا میان کلمات از آندراِسکور استفاده می کنید یا روش نامگذاری camelCase را ترجیح می دهید؟ هر چه کدهای شما گسترده تر و پیچیده تر می شوند، اهمیت بالای نامگذاری صحیح نیز آشکارتر می شود.

نکته
روش نامگذاری camelCase بدین شکل است که برای اتصال کلمات و عبارات انگلیسی به یکدیگر، حرف اول از کلمه ی اول را کوچک نوشته و پس از آن، حرف اول هر کلمه را بزرگ می نویسید. برای نمونه، اگر بخواهیم سه کلمه ی dark، blue و potato را به عنوان نام یک متغیر انتخاب کنیم، روش نامگذاری camelCase آن بدین شکل خواهد بود:

darkBluePotato

همانطور که مشاهده می کنید، در این روش، فاصله و یا علامتی میان کلمات وجود ندارد و هر کلمه تنها با استفاده از حرف اول بزرگ، از سایر کلمات تمایز داده می شود. Camel به معنی «شتر» است و علت وجه تسمیه ی این سبک نامگذاری به این نام، این بوده که ساختار نام مد نظر به صورت شماتیک همچون کوهان شتر خواهد بود.

خوشبختانه در انتخاب بهترین و راحت ترین روش برای نامگذاری، تنها نیستیم! برخی نکات و قواعد برای نامگذاری در زبان جاوا اسکریپت وجود دارند که توسط برنامه نویسان حرفه ای انتخاب شده و بر سر آن ها به توافق رسیده اند:
- از نام های خیلی کوتاه استفاده نکنیم! نام های یک کلمه ای، یک حرفهی و یا آن هایی که معنی خاصی نمی دهند، گزینه ی خوبی نیستند. مثلا x, number, digit و غیره.
- از نام های چند کلمه ای استفاده کنیم که تا حد ممکن دقیق باشند. مثل personName
- در نام های چند کلمه ای، همیشه صفات متغیر را در سمت چپ و در ابتدا بیاوریم. مثلا activeUser

زمانی که می خواهید یک نام چند کلمه ای ایجاد کنید، یک روش نامگذاری را انتخاب کرده و تا آخر، با همان روش پیش بروید. برای اتصال کلمات در نام های چند کلمه ای، دو راه وجود دارد: camelCase و آندراِسکور. جاوا اسکریپت یک زبان بسیار انعطاف پذیر است و شما می توانید از هر کدام که می خواهید، استفاده کنید اما روش camelCase در میان برنامه نویسان رایج تر است و در این دوره ی آموزشی نیز ما از روش camelCase استفاده خواهیم کرد.

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

abstract else instanceof switch
boolean enum int synchronized
break export interface this
byte extends long throw
case false native throws
catch final new transient
char finally null true
class float package try
const for private typeof
continue function protected var
debugger goto public void
default if return volatile
delete implements short while
do import static with
double in super  

متغیرهایی که همیشه ثابت اند!
گاهی اوقات، ما در کدنویسی برنامه های خود به متغیرهایی نیاز پیدا می کنیم که نمی توان (یا نباید) آن ها را تغییر داد. در این شرایط، برای ساخت این متغیرها باید از کلمه ی کلیدی "const" استفاده کنیم. مثلاً:

const heightOfMiladTower = 435;
const speedOfLight = 299792458;
const numberOfProblems = 99;
const minNumberOfBooksReadIn2015 = 13;

به منظور تست کردن ماهیت کانستنت ها، یکی از آن ها را مد نظر قرار داده و داخل تابع ()alert قرار می دهیم:

const heightOfMiladTower = 435;
alert(heightOfMiladTower);

با ذخیره کردن فایل و رفرش کردن آن در مرورگر، خواهیم دید که یک پاپ آپ نمایانگر مقدار 435 در معرض دیدمان قرار می گیرد. حال قصد داریم تا مقدار این کانستنت را تغییر دهیم. برای این منظور، کد زیر را مد نظر قرار می دهیم:

const heightOfMiladTower = 435;
alert(heightOfMiladTower);
heightOfMiladTower = 500;
alert(heightOfMiladTower);

مجدد صفحه ی مرورگر را رفرش می کنیم و خواهیم دید که دو پاپ آپ در معرض دید ما قرار می گیرد اما این در حالی است که همان مقدار اولیه ی 435 در پاپ آپ دوم هم -که پیش از آن مقدار 500 را برای heightOfMiladTower در نظر گرفته بودیم- نمایش داده خواهد شد.

متغیرهای ثابت یا Constants (کانستنت ها) از همان قوانینی پیروی می کنند که بر متغیرهای دیگر حاکم است، اما زمانی که یک کانستنت را تعریف می کنیم، دیگر امکان تغییر مقدار آن وجود ندارد. معنی لغوی واژه ی Constant معادل هایی همچون «ثابت، پایدار، نامتغیر و غیره» است و با توجه به ماهیت کانستنت ها در زبان برنامه نویسی جاوا اسکرپیت، به نظر می رسد که نام با مسمایی برای آن در نظر گرفته شده است.

همان طور که مشاهده می کنید، کانستنت ها عموماً برای نگهداری مقادیری که عمومی و همواره درست هستند (مانند سرعت نور) و یا مقادیری در برنامه که می دانیم همیشه ثابت هستند، استفاده می شوند.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
سلام و تشکر
در قسمت نام گزاری متغیر ها بالای هشدار خط آخر فکر کنم به جای ننمایید از نمایید استفاده کرده اید.
کاربر میهمان
کاربر میهمان
سلام و تشکر
در قسمت نام گزاری متغیر ها بالای هشدار خط آخر فکر کنم به جای ننمایید از نمایید استفاده کرده اید.
کاربر میهمان
کاربر میهمان
سلام
چرا در مرورگر کروم من ، پاپ آپ نمایش داده نمیشه و در عوض می گه:
جمله بالا رو تصحیح می کنم ، الان میشه
قبل از اینکه اشتباهی برم صفحه قبل و برگردم اینجا یک نوشته قرمز رنگ میومد و پاپ آپ نشون نمی داد.
عه ! الان هم که بعد از بار اول می خوام دوباره کد رو به صورت پاپ آپ نمایش بده ، نمیشه . دلیل این چیه
کاربر میهمان
کاربر میهمان
سلام
ببخشید اون کد آخر که نوشتید اجرا نمی شه. pop-up ها رو میگم.
تشکر
saman
saman
عالی عالی عالی عالی عالی عالی عالی