توابع

 

عموما ما نیاز داریم که یه عمل مشابه رو چندین جا اجرا کنیم.

مثلا ما میخوام یه پیام زیبایی رو به کاربر در زمان ورود و خروج نشون بدیم.

و اینکه همون کد رو چندین جای دیگر از پروژه استفاده کنیم.

توابع بلوک های اصلی برنامه هستند.

که با ما اجازه میدهن کد ها نوشته شده رو بدون اینکه دوباره بنویسیم هر وقت بخواهیم اجرا کنیم.

 

قبلا نمونه های از توابع ساخته شده رو دیدیم.alert(message)prompt(message, default) وconfirm(question).

اما ما میتونیم توابعی رو برای خودمون ایجاد کنیم.

تعریف تابع

برای تعریف یک تابع میتونیم از عبارت function استفاده کنیم.

نمونه:

ابتدا کلمه function سپس نام تابع سپس لیستی از پارامتر ها که داخل پرانتز قرار دارند.

و در نهایت کد تابع که بدنه تابع نام دارد رو داخل پرانتز مینوسیم .

ما تابع مون رو میتونیم با نام تابع فراخوانی کنیم .

برای مثال داریم:

با فراخوانی تابع کد بدنه که در بالا نوشتیم اجرا میشه.

در اینجا با توجه به اینکه دو بار نوشتیم تابع ما دو بار اجرا میشه .

مثال بالا به اصلی ترین هدف تابع که جلوگیری از تکثیر کد بود رسیدیم.

اگر ختی نیاز داشته باشیم که متن پیام  یا نخوه نمایش رو تغییر بدیم کافیه که قسمتی از اون رو تغییر بدیم .

متغیر های محلی

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

برای مثال :

متغیر های خارجی

متغیر های که بیرون از توابع تعریف شده و داخل تابع میتونیم ازشون استفاده کنیم. مثلا:

توابع دسترسی کامل به متغیر های خارجی دارند و میتونن اونها رو تغیر بدن .

مثال زیر رو ببینیم:

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

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

مثال زیر رو ببنیم :


متغیر های عمومی

متغیر های که بیرون توابع تعریف شده اند که در بخش بالا اونا رو متغیر های خارجی شناختیم را متغیر های عمومی مینامیم.

متغیر های عمومی درون همه توابع در دسترس هستند.

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

هرچند بعضی مواقع میتونن برای نگهداری داده های سطح پروژه استفاده بشن .


پارامتر ها

ما میتونیم داده های دلخواه رو با استفاده از پارامتر ها به توابع منتقل کنیم(در بعضی جاها ما اونا رو آرگومان هم میگیم بهشون) .

در مثال زیر تابع ما دارای دو پارامتر from و text هست:

 

وقتی که ما در خط  (*) و(**), تابع رو فراخوانی میکنیم ، مقادیر داده شده در متغیر های محلی from وtextکپی میشوند.سپس تابع از اون مقادیر استفاده میکنه .

 

یک مثال دیگه:

ما متغیر from  رو داریم که اونو به تابع منتقل میکنیم.

توجه داشته باشید که تغیراتی که داخل توابع روی متغیر from اعمال میشه بیرون تابع تغیر داده نمیشه.

به همین دلیل میتونیم بگیم که توابع همیشه یک کپی از مقدار رو برمیدارن:

 

مقدار پیشفرض

اگر پارامتری ارائه نشده باشه سپس مقدار متغیر undefined میشه .

برای مثال ، تابع بالا که در موردش صحبت کردیم میتونه با یک پارامتر فراخوانی بشه:

هیچ خطای نخواهیم داشت و در خروجی “Ann: undefined” رو به ما میده .

زمانی که برای این پارامتر هیچ مقداری را پاس ندادیم مقدارش به صورت پبشفرض undefined هست.

در صورتی که  میخواهیم مقدار پیشفرض دیگری رو براش تنظیم کنیم باید در با = مقدار پیشفرضی رو قرار بدیم:

جالا در صورتی که مقدار به متغیر text پاس داده نشه متغیر دارای مقدار اولیه “no text given” میباشد.

در این مثال مقدار پیشفرض ما یه رشته هست اما ما میتونیم یک عبارت پیچیده تری داشته باشیم که با یک محاسباتی مقدار اولیه محاسبه شده و در متغیر قرار گیرد:


ارزیابی پارامتر های پیشفرض

در جاوااسکریپت هر زمانی که تابع بدون پارامتر فراخوانی بشه مقدار پیشفرض محاسبه میشه.

در مثال بالا هر زمانی که تابع showMessage بدون پارامتر text فراخوانی بشه  تابع anotherFunction() اجرا میشه .


 


شکل قدیمی مقدار پیشفرض

در نسخه های قبلی مقدار پیشفرض رو پشتیبانی نمیشد . بنابراین روش های جایگزینی برای اون داشتیم. که میتونید در کد های قدیمی تر اونو ببینید.

برای مثال مقدار پارامتر برسی میشه که مخالف undefined باشه:

یا با عملگر Or || :


 

برگرداندن یک مقدار

یک تابع میتونه مقداری رو هنگام فراخوانی به عنوان نتیجه برگردونه.

یک مثال ساده تابعی که جمع دو مقدار رو برمیگردونه :

درستور return میتونه هر کجای از تابع قرار بگیره.

وقتی که اجرا به دستور return میرسه تابع متوقف شده و مقدار مورد نظر را برمیگرداند.

ممکن است که در چندین جا مقداری رو توی تابع برگیدانید:

این امکان وجود دارد که با استفاده از return خروجی تابع دیگری رو برگردانید:

در کد بالا در صورتی که نتیجه تابع checkAge(age) false باشد.
سراغ نتیجه confirm میره سپس نتیجه در alert نمایش داده نمیشه.

 


وقتی توی یه تابع چیزی بر نمیگردونیم مقدار بازگشتی undefined خواهد بود.

وقتی که return رو اصلا نمینویسیم:

یا وقتی که یا وقتی که جلوی return چیزی نمینویسیم:


 

هیچ وقت مقدار بازگشتی رو توی خط بعدی ننویسید.

برای دستورات طولانی ممکنه که شما وسوسه بشید که مقدار رو در خط جدید مثل نمونه زیر بنویسید:

چون جاوااسکریپت فرض میکنه بعد return باید ; باشه در اینصورت فکر میکنه همچنین کدی نوشتید :

و در نهایت یه هیچی برنمیگردونه.

در نهایت اگه زمانی هم خواستیم که مقادری رو تو چندین خط return کنیم باید پرانتز شروع عبارات رو توی همون خطی که return قرار داره بنویسیم:

و دقیقا مثل همونی که انتظارش رو داشتیم کار میکنه.


نامگذاری یه تابع

در واقعا توابع عملکرد ها هستند. پس معمولا اسمشون یه فعل هست. باید مختصر باشه ، تا حد امکان دقیق و اینکه توضیح دهنده اینکه تابع چیکار میکنه باشه تا کسی که کد رو میخونه بدونه که این تابع چه کاری رو انجام میده.

اگه تیمی کار میکنید میتونید با هم صحبت کنید و یه توافقی در مورد پیشوند توابع داشته باشید.

معمولا توابعی که با show شروع میشوند معمولا میتونن برای نمایش دادن یه چیزی استفاده بشن.
یا به طور مثال :

  • "get…" – مقداری رو برگردونن,
  • "calc…" – یه چیزی رو محاسبه کنند,
  • "create…" – چیزی رو ایجاد کنند,
  • "check…" – یه چیزی رو بررسی کنند و در نهایت یه مقدار boolean رو برگردونن، یه هر چیز دیگه ای.

میتونن به عنوان پیشوند توابع استفاده بشن.

چند نمونه رو ببینیم :

با قرار دادن این پیشوند ها با یه نگاه به تابع میشه فهمید که کارش چیه و چی رو return میکنه.

 


هر تابع یه کار

هر تابع دقیقا اون کاری رو انجام مبده که از اسمش مشخصه نه بیشتر. دو عمل مستقل رو معمولا باید تو دو تا تابع نوشت.

حتی اگه معمولا با هم فراخوانی بشن در این صورت هم مهم نیستن و راه حل اینه که دو تا تابع رو توی تابع سومی فراخوانی کرد.

چند نمونه از نقض این قانون:

  • getAge – اشتباه است اگه توی این تابع سن را در alert نشان بدیم این تابع باید خروجی یه عدد سن رو return کنه.
  • createForm – اشتباه است اگه این تابع کار تغییر اسناد رو انجام بده بعد فرم رو بسازه فقط باید فرم رو ایجاد کنه همین..
  • checkPermission – اشتباه است اگه که به غیر بررسی نشون بده که دسترسی وجود نداره.

در نهایت باید شما و تیم درک درستی از این پشوند ها داشته باشید و با هم به توافقی رسیده باشد و دانشهاتون رو به اشتراک بذارید.


 


تابع با نام فوق کوتاه

بعضی مواقع توابعی که استفاده میکنیم نامشون فوق کوتاه است.

برای نمونه کتابخانه فریمورک JQUERY  تابعی با نام $ تعریف میکنه.اما اینا استثنا هستند و نام توابع باید مختصر و توصیف کننده کاری که انجام میدن باشن.


 

توابع== comments

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

نه تنها باعث میشه که تست و اشکال زدای ساده تر بشه بلکه منجر میشه که یه کامنت خوب داشته باشیم.

به عنوان مثال دو تابع زیر رو ببینید ، هر دو تابع اعداد اول یک تا n رو تولید میکنند.

 

اولیش که از label استفاده کرده:

و دومیش از یه تابع اضافه  isPrime(n) برای بررسی اول بودن استفاده کرده:

میبینیم که واقعا نوع دوم خواناتر و درک راحتری نسبت به اولیه داره .

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

توابع به صورت زیر تعریف میشن:

  • مقادیر به توابع به عنوان پارامتر ارسال میشوند و در متغیر های داخلی تابع کپی میشوند.
  • یه تابع میتواند به متغیر های خارج از تابع دسترسی داشته باشه. اما از خارج از تابع نمیشه به متغیر های داخلی تابع دسترسی داشت.
  • یه تابع میتونه یه مقداری رو return کنه .اما اگه چیزی return نکنه مقدار بازگشتی اون undefined هست.

 

برای بهم راحتر و کد نویسی تمیز بهتره که متغیر های داخلی تعریف کنید نه اینکه از متغیر های خارج تابع استفاده کنید.

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

 

  • نامگذاری توابع:
    نام باید به وضوح عملکرد تابع رو توصیف کنه و با فراخوانی تابع ما میتونیم متوجه بشیم که این تابع چیکار میکنه و چی رو return میکنه .
  • هر تابع یه عملی رو انجام میده پس نام تابع باید یه فعل باشه.
  • در نامگذاری توابع از پیشوند های استاندارد استفاده کنیم.

 

توابع اصلی ترین قسمت اسکریپت ها هستند و ما اصول اولیه رو پوشش دادیم. میتونیم توابع رو تعریف و استفاده کنیم.
اما اینها اصول اولیه توابع بودند بعدا بیشتر در مورد ویژگی های پیشرفته توابع توضیح میدیم.

 

 

منبع : javascript.info

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *