وب

قدرت توابع جاوا اسکریپت – بخش دوم

در بخش اولِ قدرت توابع جاوا اسکریپت، با یک سری از ویژگی ها و توابع جاوا اسکریپت آشنا شدیم. اما توابع جاوا اسکریپت به همین جا ختم نمی شوند و می توان گفت، دنیایی نا متناهی دارند. هنگامی که نکته های ظریفی از توابع جاوا اسکریپت را استفاده می کنید و با به کار بردن آن ها احساس راحتی بیشتری می کنید، پس شما بخش قابل توجهی از جاوا اسکریپت را تجربه کرده اید. البته، طرف دیگر سکه این است که باید کمی زمان بگذارید تا نحوه استفاده از توابع جاوا اسکریپت در زمینه های مختلف را به طور موثری یاد بگیرید.(توصیه می شود دوره آموزشی طراحی سایت و پکیج آموزش طراحی سایت  را مشاهده کنید)

قبل از این که بحث را ادامه دهیم، نگاه دوباره ای به نقل قولی از داگلاس کراکفورد در ابتدای مقاله قدرت توابع جاوا اسکریپت – بخش اول بیاندازیم؛ لازم به ذکر است که آن نقل قول، ناقص است و بخشی از آن حذف شده است. بیایید به نسخه کامل نگاهی کنیم:

“توابع بهترین بخش از جاوا اسکریپت هستند. در حقیقت، بیشترین قدرت و زیبایی این زبان، توابع آن است. اما، مانند هر چیز دیگری در جاوا اسکریپت، آن ها کاملا درست نیستند.” داگلاس کراکفورد  Douglas Crockford

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

جاوا اسکریپت

عبارات تابع و حالت تابع / Function expressions vs. function statements

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

تفاوت در این است که چگونه مرورگر آن ها را در متن اجرا، بار گذاری می کند. عبارت تابع دقیقا مانند سایر متغیر ها بارگذاری می شود. وقتی کامپایلر به این خط از کد جاوا اسکریپت می رسد، یک مقدار (در این مورد شیء تابع) تعیین می شود.

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

یاد آوری:

  • اگر قبل از اعلان عبارت تابع، آن را فراخوانی کنید، یک خطا دریافت خواهید کرد.
  • اگر قبل از اعلان حالت تابع، آن را فراخوانی کنید، كار خواهد كرد.

چرا دو راه وجود دارد؟

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

جاوا اسکریپت

ساختار تابع در جاوا اسکریپت

همان طور که قبلا ذکر شد، از دیدگاه نوع داده / data type، هر تابع یک شی است. شیء تابع دارای ۳ ویژگی بسیار مهم است که هویت آن تابع را نشان می دهد: this ، arguments  و prototype.

this در جاوا اسکریپت چیست؟

در فراخوانی تابع، this یک مرجع به شیء ای است که آن فراخوانی را ایجاد کرده است. مقدار “this” در تابع فراخوانی شده است. به این ترتیب، این تابع مشخص می کند که کدام شی مورد نظر است.

وقتی یک تابع به سادگی از محدوده سراسری فراخوانی می شود، “this” به وضوح به محدوده سراسری اشاره می کند.

“this” برای توابع بسیار مفید است و به عنوان یک روش، خیلی مورد استفاده قرار می گیرد. به این صورت، این روش به خواص شیء دسترسی دارد.

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

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

در پشت صحنه، موارد زیر اتفاق می افتد:

  • یک شی جدید خالی ایجاد شده است.
  • تابع car با “this” فراخوانی شده است و به شیء جدید محدود شده است. (به طوری که شیء، نام صفت و مقدار “Subaru” را گرفته است)
  • شیء جدید برگردانده شده است.

هر تابع به apply، bind و call دسترسی دارد که از Array.prototype گرفته شده است. آن ها به تابع اجازه می دهند که با هر مقداری از this که به طور صریح تنظیم می شود، فراخوانی شود.

به یاد داشته باشید: ۴ راه برای فراخوانی یک تابع وجود دارد:

  • فرم تابع (this در حالت سخت / strict یا یک شیء سراسری خواهد شد یا تعریف نشده خواهد بود)
  • فرم method (this به شیء که فراخوانی را انجام می دهد، ارجاع داده خواهد شد)
  • فرم سازنده constructor (this یک شی جدید خواهد شد)
  • فرم apply/bind/call (“this” صریحا تنظیم شده است)

آرگومان های تابع در جاوا اسکریپت

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

خوشبختانه صفت آرگومان تابع به ما در اینجا کمک می کند. و در حقیقت، یک شیء آرایه مانند است که شامل آرگومان هایی است که در فراخوانی ارائه شده است. این یک آرایه واقعی نیست به این معنا که از Array.prototype گرفته نمی شود و به روش هایی برای ویرایش عناصر دسترسی ندارد. اما دارای صفت طول است و دقیقا مشخص می کند که چه تعدادی از آنها ارائه شده است. آرگومان دقیقا مثل یک آرایه ذخیره می شود، و با یک شاخص / index از ۰ شروع می شود.

اگرچه شیء آرگومان فقط خواندنی / read-only نیست، شدیدا توصیه می شود که آن را ویرایش نکنید. تغییر شیء آرگومان بر پارامترها نیز  تاثیر می گذارد و یک منبع عالی برای سردرگمی خواهد بود!

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

یاد آوری:

  • اشیاء آرگومان تنها منبع قابل اطمینان اطلاعات در مورد آن چه که در تابع ارائه شده است، می باشند.
  • آرگومان را به عنوان یک ساختار فقط خواندنی در نظر بگیرید.

جاوا اسکریپت و نمونه اولیه تابع / Function Prototype

شیء نمونه اولیه تابع تنها زمانی که تابع به عنوان یک سازنده استفاده می شود، معنا پیدا می کند. این موضوع در ایجاد ارث / inheritance در جاوا اسکریپت نقش کلیدی دارد. در این حالت، اشیاء ایجاد شده توسط سازنده ی یکسان، می توانند خواص و رفتار یکسانی را به اشتراک بگذارند. البته نمونه اولیه یک موضوع خیلی گسترده است و خارج از محدوده این مقاله است. برای اطلاعات بیشتر، به مقالات مرتبط با نمونه اولیه مراجعه کنید.

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

نوشته های مشابه

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

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

دکمه بازگشت به بالا