قواعد استفاده از سمی کالن در جاوا اسکریپت

Ratings
(1)

 

در این بخش، بررسی می کنیم که سمی کالن ها  چگونه در زبان جاوا اسکریپت به کار می روند. این قواعد اساسی عبارتند از:

توی این مقاله، می خواهیم ببینیم که سمی کالن ها در زبان جاوا اسکریپت چطوری به کار می روند. سمی کالن ها از دو قاعده زیر پیروی می کنن:

  • در حالت عادی، همه دستورات(statements) توسط سمی کالن ها پایان می یابند.
  • دستوراتی که پس از آنها بلوک(block) قرار دارد، یک استثنا محسوب می شن.

استفاده از سمی کالن ها توی جاوا اسکریپت اختیاری هست. به درج خودکار سمی کالن در جاوا اسکریپت، اصطلاحاً ASI گفته می شه؛  برای اطلاعات بیشتر در این زمینه به صفحه 59 بروید. اما ASI همیشه درست کار نمی کنه. پس علت اینکه همواره در جاوا اسکریپت از سمی کالن ها استفاده می کنیم روشن شد.


استفاده نکردن از سمی کالن، پس از دستورات جاوا اسکریپت

اگه در انتهای دستورات زیر، یک بلوک(یک جفت آکولاد) وجود داشته باشه، لازم نیست با سمی کالن خاتمه داده بشه:

1. حلقه ها: مثل حلقه های for و while (اما نه حلقه ی do-while)

2. شرطی ها: مثل if و switch و try

3. تعریف توابع(اما نه عبارت های تابعی(function expressions))

در کدهای زیر، مثالی برای استفاده یا عدم استفاده از سمی کالن، در دستور while و do-while زده ایم:

while (a > 0) {
    a--;
} // بدون سمی کالن
do {
     a--;
} while (a > 0);

در کدهای زیر، به ترتیب یک مثال برای تعریف یک تابع(function declaration) و یک مثال برای تعریف یک عبارت تابعی(function expression) آورده شده. بعدِ عبارت تابعی در خط شماره 6، یک سمی کالن قرار می گیره، برای اینکه در درون یک اعلانِ var قرار داره(که به یک سمی کالن ختم می شه):

function foo() {
    // ...
} // no semicolon
var foo = function () {
   // ...
};

 


نکته: اگه پس از یک بلوک(یک جفت آکولاد)، یک سمی کالن اضافه کنیم، با هیچ خطایی روبه رو نمی شیم، زیرا این سمی کالن بعنوان یک دستور خالی(empty statement) در نظر گرفته می شه(به بخش بعدی توجه کنید).

نکته: اکثر چیزهایی که باید در مورد سمی کالن ها بدونیم، همینه. اگه همواره سمی کالن ها رو اضافه کنید، می تونید بدون خواندن بقیه ی بخش های این مقاله، به کارتون ادامه بدید.


دستور خالی(Empty Statement) در جاوا اسکریپت

یه سمی کالن، به خودی خود یه دستور خالی محسوب می شه و کاری انجام نمیده. در هر جایی که به یک دستور(statement) نیازه، دستورات خالی هم می تونن استفاده بشن. دستورات خالی، در جاهایی که جا داره که یه دستور ادامه پیدا کنه، اما ما نیازی به این ادامه دادن نداریم، مفید هستند. در چنین موقعیت هایی، معمولاً می تونیم از بلوک ها هم استفاده کنیم. بعنوان مثال، دو دستور زیر معادل یکدیگر هستند؛ دستوری که در خط شماره 1 قرار داره، while نام داره و به طور کلی یک جفت آکولاد هم داره، اما ما در اینجا نیازی به اون بخش ها نداریم، بنابراین کدها رو با یه سمی کالن خاتمه می دیم.اما در خط شماره 2، دستور while به طور کامل آورده شده است:

while (processNextItem() > 0);
while (processNextItem() > 0) {}

 فرض می شود که تابع processNextItem تعداد آیتم های باقی مانده را برمی گرداند. در برنامه ی زیر، سه دستور خالی(empty statements) وجود دارند که استفاده از آنها از نظر نحوی صحیح است:

;;;

 


درج خودکار سمی کالن در جاوا اسکریپت

هدف درج خودکار سمی کالن(ASI) این است که استفاده از سمی کالن ها در انتهای یک خط، اختیاری باشن. وقتی که می گیم: درج خودکار سمی کالن، تصور می کنیم که تجزیه کننده جاوا اسکریپت(parser) سمی کالن ها را برای ما اضافه می کند. اما جور دیگری نیز می توان گفت: درج خودکار سمی کالن یا ASI به تجزیه کننده(parser) کمک می کند تا تعیین کند که یک دستور چه زمانی پایان می یابد. در حالت عادی، یک دستور، با یک سمی کالن خاتمه پیدا میکنه.

ASI در موارد زیر، دستورات را پایان می دهد:

  1. اگر پس از یک پایان دهنده ی خط (مانند newline) یک توکن غیر قانونی قرار داشته باشد.
  2. اگر با یک آکولاد بسته مواجه شویم.
  3. اگر به اتنهای فایل مورد نظر رسیده باشیم.

 مثال: یک ASI و یک توکن غیرقانونی

در کدهای زیر، در خط شماره 1، سمی کالن قرار داده نشده است، و پس از آن(در خط دوم) یک عبارت غیرقانونی قرار دارد:

 

if (a < 0) a = 0
console.log(a)

 در کدهای بالا، عبارت console که پس از 0 درخط بعدی، قرار دارد، غیر قانونی است و باعث می شود ASI فعال شود:

if (a < 0) a = 0;
console.log(a);

مثال: استفاده از ASI یا آکولاد بسته

در کدهای زیر، دستور درون آکولادها با یک سمی کالن خاتمه پیدا نکرده است:

function add(a,b) { return a+b }

 بنابراین ASI یک نسخه با سینتکس صحیح از کدهای بالا را ایجاد می کند:

function add(a,b) { return a+b; }

هشدار: ASI می تواند به طور ناخواسته، باعث شکست در دستورات شود. همچنین اگر یک خاتمه دهنده ی خط(یعنی یک سمی کالن) پس از کلمه کلیدی return وجود داشته باشد، ASI فرا خوانده می شود. بعنوان مثال داریم:

// این کار را انجام ندهید
return
{
    name: 'John'
};

ASI کدهای بالا را به صورت زیر تبدیل می کند:

return;
{
   name: 'John'
};

 خط شماره 1 در کدهای بالا، یک دستور return خالی است که پس از آن (در داخل یک بلوک) یک برچسب name قرار دارد و روبه روی آن عبارت دستوری 'John' قرار دارد. پس از این بلوک، یک سمی کالن(دستور خالی) قرار دارد.

 هشدار: ASI ممکن است به صورت ناخواسته، فعال نشود.

گاهی اوقات، یک دستور در یک خط جدید(new line) با یک توکن شروع می شود که به عنوان ادامه عبارت قبلی مجاز است مورد استفاده قرار گیرد. در اینجا ASI فراخوانی نمی شود، با اینکه به نظر می رسد که باید فراخوانی شود. بعنوان مثال:

func()
[ 'ul', 'ol' ].foreach(function (t) { handleTag(t) })

 در کدهای بالا، در خط شماره 2  براکت ها مانند یک اندیس، در آنچه که توسط تابع func()  برگردانده میشه جستجو می کنند.

 


نکته: عبارت func() تابع func رو راه اندازی می کنه و این تابع مقادیری رو retrun می کنه و عبارت ['ol'] از مقادیر return شده به جستجوی کلید های آرایه ها می پردازه.


علامت کامای به کار رفته در براکت ها، یک عملگر کاما محسوب می شه و همواره عملوند سمت راست یعنی، مقدار 'ol' را برمی گرداند. برای اطلاعات بیشتر، به مقاله ی عملگر کاما در صفحه 90 مراجعه کنید. بنابراین جاوا اسکریپت کدهای بالا را به صورت زیر تفسیر می کند:

func()['ol'].foreach(function (t) { handleTag(t) });

 

  • بازدید: 953

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال