عبارت ها و دستورها در زبان جاوا اسکریپت
در این بخش، به یک تمایز سینتکسی مهم در زبان برنامه نویسی جاوا اسکریپت می پردازیم: تفاوت بین عبارات(expression) و دستورها(statement) در جاوا اسکریپت.
عبارت یا expression در جاوا اسکریپت
یک عبارت، به چیزی گفته می شود که یک مقدار(value) تولید کند و بتواند در هر جایی که به یک مقدار نیاز باشد، نوشته شود؛ مثلاً، می توانیم یک آرگومان در فراخوانی یک تابع، یا بخش سمت راست یک انتساب، را مثال بزنیم. در هریک از خطوط زیر، یک عبارت تعریف شده است:
myvar
3 + x
myfunc('a', 'b')
دستور یا Statement در جاوا اسکریپت
به طور تقریبی، می توان گفت که یک دستور(statement)، یک عمل یا کار را انجام می دهد. حلقه ها و دستور if مثال هایی از دستورات هستند. یک برنامه، در حقیقت یک دنباله از دستورات است. (برای ساده شدن کار، من وانمود می کنم که اعلان ها یا declarations دستور هستند). هنگامی که جاوا اسکریپت به یک دستور(statement) نیاز دارد، ما می توانیم یک عبارت(expression) را بنویسیم. به چنین دستوری، عبارت دستوری(expression statement) گفته می شود.
معکوس کردن این کار، امکان پذیر نیست: یعنی نمی توانیم وقتی که جاوا اسکریپت به یک عبارت(expression) نیاز دارد، یک دستور(statement) بنویسیم. بعنوان مثال، یک دستور if نمی تواند بعنوان یک آرگومان از یک تابع به کار برود.
دستورات شرطی(Conditional statement) و عبارات شرطی(conditional expressions) در جاوا اسکریپت
اگر ما به اعضاء دو فرمانِ نحویِ مشابه نگاه کنیم، تفاوت بین دستورات(statement) و عبارات(expression) روشن تر می شود: مثلاً می خواهیم دستور if و عملگر شرطی(conditional operator) را مورد بررسی قرار دهیم. کدهای زیر، یک مثال از دستور if را نشان می دهند:
var salutation;
if (male) {
salutation = 'Mr.';
} else {
salutation = 'Mrs.';
}
در زیر، یک عملگر شرطی(conditional operator) وجود دارد که معادل کدهای بالا می باشد:
var salutation = (male ? 'Mr.' : 'Mrs.');
کدهای بین علامت مساوی و علامت سمی کالن، یک عبارت(expression) محسوب می شوند. استفاده از پرانتزها ضروری نیست، اما من(نویسنده) از آن استفاده کرده ام زیرا باعث می شود خواندن عملگر شرطی، ساده تر شود.
استفاده از عبارت های مبهم بعنوان دستورها
دو نوع عبارت(expression) وجود دارند که شبیه دستورات(statements) هستند. آنها با توجه به زمینه ی نحوی خود، مبهم هستند.
1. لیترال های آبجکت(عبارت) مانند بلوک ها(دستور) هستند:
{
foo: bar(3, 5)
}
کد بالا، یا یک لیترالِ آبجکت است(object literal) و یا یک بلوک (تابعی) است که توسط برچسب :foo دنبال شده است؛ و پس از آن یک تابع به نام bar(3, 5) قرار گرفته است. برای اطلاعات بیشتر در مورد لیترال های آبجکت، به صفحه 198 مراجعه کنید.
2. عبارت های تابعی نام گذاری شده(عبارت)، مانند تعریف توابع(دستور) هستند:
function foo() { }
کد بالا، یا یک عبارت تابعی نام گذاری شده(a named function expression) است یا یک تعریف تابع(a function declaration) است. اولی، باعث می شود که یک تابع تولید شود، و دومی یک متغیر ایجاد می کند و یک تابع را به آن انتساب می دهد(جزئیات بیشتر را در صفحه 166، در بخش تعریف تابع ها مشاهده کنید).
برای جلوگیری از ایجاد ابهام در حین تجزیه کدها، جاوا اسکریپت به ما اجازه نمی دهد تا از لیترال های آبجکت(object literals) و عبارت های تابعی(function expressions) بعنوان دستور(statements) استفاده کنیم. به همین علت، عبارت های دستوری(expression statements) باید با دو مورد زیر شروع شوند:
- یک آکولاد
- کلمه ی کلیدی function
اگر یک عبارت(expression) با یکی از دو مورد گفته شده، شروع شود، تنها می تواند در یک عبارت(expression context) مورد استفاده قرار گیرد. بعنوان مثال، برای رعایت کردن این قاعده، می توانیم پرانتزها را به دور عبارات(expression) قرار دهیم. در ادامه، دو مثال می آوریم که نشان می دهد چرا این کار ضروری است.
ارزیابی یک لیترال آبجکت از طریق متد eval()
متد eval() آرگومان داده شده به خود را به صورت دستورات متنی(statement context) تجزیه و اجرا می کند. اگر بخواهیم متد eval() یک آبجکت را برای ما برگرداند، باید به دور یک لیترال آبجکت(object literal)، یک جفت پرانتز قرار دهیم. برای اطلاعات بیشتر در مورد متد eval این مقاله را مطالعه کنید.
> eval('{ foo: 123 }')
123
> eval('({ foo: 123 })')
{ foo: 123 }
عبارت تابعی خود فراخوان(IIFE) در جاوا اسکریپت
کدهای زیر، یک عبارت تابعی خود فراخوان(IIFE) را نشان می دهد؛ یک تابع که کدهای درون بدنه ی آن، بلافاصله اجرا می شوند. ( در صفحه 183، توضیح داده ایم که چرا ایفی ها مورد استفاده قرار می گیرند. همچنین در این مقاله، ایفی ها را توضیح داده ایم).
> (function () { return 'abc' }())
'abc'
اگر ما در الگوی ایفی، پرانتزها را حذف کنیم، با یک خطای سینتکسی مواجه خواهیم شد، زیرا جاوا اسکریپت با تعریف یک تابع مواجه می شود که نمی تواند بی نام باشد:
> function () { return 'abc' }()
SyntaxError: function statement requires a name
همچنین اگر ما برای تابع بالا یک نام مشخص کنیم، باز هم یک خطای سینتکسی را مشاهده می کنیم؛ زیرا تعریف توابع نمی توانند بلافاصله مورد اجرا قرار گیرند:
> function foo() { return 'abc' }()
SyntaxError: Unexpected token )
آنچه که باید به دنبال یک تعریف تابع بیاید، تنها می تواند یک دستور قانونی(legal statement) و یک جفت پرانتز باشد.
بلوک ها و دستورات کنترل جریان(Control Flow) در جاوا اسکریپت
برای کنترل جریان(control flow) دستورات، بدنه کدها باید یک دستور تکی باشد. به دو مثال زیر توجه کنید:
if (obj !== null) obj.foo();
while (x > 0) x--;
اما هر دستور، همواره می تواند با یک بلوک(block)، و آکولادهایی که حاوی صفر یا تعداد بیشتری دستور هستند، جایگزین شود. بنابراین می توانیم کدهای زیر را بنویسیم:
if (obj !== null) {
obj.foo();
}
while (x > 0) {
x--;
}
من(نویسنده) دومین روش، از دستور کنترل جریان را می پسندم. استاندارد سازی بر روی روش دوم، یعنی اینکه تفاوتی بین بدنه های دستورات تکی(single-statement) و بدنه های دستورات چندگانه(multistatement) نیست. بعنوان یک نتیجه،(با استفاده از آکولادها) کدهای ما سازگار تر به نظر می رسند و جایگزینی بین یک دستور و بیش از یک دستور ساده تر است.
- بازدید: 519
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.