قسمت سوم – مفاهیم و الگوهای برنامه نویسی تابعی (Functional) در جاوااسکریپت
در هر زبان برنامه نویسی فانکشن وجود دارد مثلا در جاوااسکریپت فانکشن ساده زیر:
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/l1rsn5c4cs4v.png)
اما فقط در زبان هایی که برنامه نویسی تابعی را پشتیبانی می کنند شما می توانید مانند جاوااسکریپت عبارت زیر را داشته باشید و تابع را به یک متغییر تخصیص دهید.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/ctmpxhj0p3e0.png)
پس همانطور که در قسمت اول این گفتار اشارهای داشتیم :
فانکشن در برنامه نویسی تابعی و به دنبال آن در جاوااسکریپت یک مقدار است.
در ادامه کاربردهای این قابلیت را توضیح خواهیم داد.
توابع Higher-order
تابعی که تابع دیگر را به عنوان پارامتر و همانطور که گفتیم به عنوان یک مقدار قبول می کند و یا تابعی را به عنوان نتیجه بر می گرداند تابع Higher-order نامیده میشود.
اما این قابلیت چه کاربردی دارد؟
با توابع Higher-order ما می توانیم چند فانکشن را با هم ترکیب کنیم و کد را خوانا و کمتر کنیم.
فرض کنید ما یک آرایه از اشخاص داریم و می خواهیم اشخاصی که ایرانی هستند جدا کنیم.
راه اول این است که با یک حلقه for این کار را انجام دهیم مثال زیر:
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/7e0daz6kbop5.png)
اما همین کار را می توانیم با filter انجام دهیم
به این صورت که اول یک فانکشن بنویسیم که ملیت شخص را چک کند و نتیجه آن را به تابع فیلتر به صورت زیر ارسال کنیم.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/wn8enpglaxfc.png)
نتیجه دو روش فوق یکی و آن آرایهای از اشخاص ایرانی است اما همانطور که می بینیم در روش دوم با استفاده از تابع Higher-order با کد کمتر و بدون حلقه for توانستیم نتیجه مشابه را بدست بیاوریم.
لازم بذکر است که می توانیم با قابلیت های ES6 در جاوااسکریپت کد فوق را کمتر هم به صورت زیر بنماییم.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/cqhz67zlebdg.png)
تابعی Map مثل filter که در قسمت فوق صحبت کردیم یک تابع Higher Order دیگر است و مثل filter یک آرایه را می پیماید و برخلاف filter که چند رکورد از آرایه را بر می گرداند، map آرایه ورودی را می تواند تغییر شکل دهد.
فرض کنید همان آرایه اشخاص را بخواهیم به این صورت در بیاوریم که فقط اسم آنهایی در آرایه باشد و ملیت آنها در آرایه وجود نداشته باشد.
روش اول با استفاده for..loop به صورت زیر است.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/3ky70ionjp8k.png)
اما همین کد را می توانیم با استفاده از تابع map با استفاده از برنامه نویسی تابعی به صورت زیر بنویسیم.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/lymudxhqkarq.png)
و با استفاده از Es6 به صورت ساده و خوانا زیر بنویسیم.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/krtjt7e2bja1.png)
تابع دیگری که می خواهیم اینجا اشارهای داشته باشیم، reduce است، reduce بر خلاف توابع فوق یعنی filter و map که یک آرایه دیگر برمی گردانند تابع reduce با اجرای فانکشن reduce که شما برای هر عنصر آرایه تولید می کنید در نهایت یک مقدار برمی گرداند.
به عنوان مثال شما اگر بخواهید مجموع مقادیر آرایه زیر را باهم جمع کنید.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/5kxdg2ljd38t.png)
ابتدا یک فانکشن reduce به صورت زیر ایجاد میکنیم
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/d89eeun6a7ff.png)
و این فانکشن را به تابع reduce ارسال می کنیم
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/twowpmkbmu3i.png)
توجه داشته باشید که تابع reduce دو مقدار می گیرد، currentValue مقدار جاری هر عنصر آرایه و accumulator جمع مقادیر است
به مثال کامل زیر و خروجی آن توجه کنید و لازم بذکر است همانطور که در مثال زیر می بینیم می توانیم به reduce علاوه بر فانکشن مقدار اولیه مقادیر را ارسال نمود.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/v1rmqexapigz.png)
خروجی کد فوق به صورت زیر است.
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/6lzjll0lpigs.png)
این قسمت را اینجا پایان می دهیم در قسمت بعدی Closures و Currying بررسی خواهیم کرد.
لینک قسمت های قبلی رانیز میتوانید مشاهده فرمایید.
قسمت اول
قسمت دوم
![](https://files.virgool.io/upload/users/3499/posts/ahghq73jewk6/xtzgz67ljnmc.png)