خب همونطوریکه توضیح دادیم Higher-order function ها چی هستن و یدونه اختصاصیش رو هم برای خودمون ساختیم حالا وقتشه که بیشتر وارد جزییات بشیم و ببینیم توابع callback چی هستن
قبل از هرچیزی بهتره بدونیم که صدا کردن یا Call کردن یه فانکشن یعنی عملیاتی کردن اون تابع در همون لحظه درحالیکه پاس دادن مقدار اون تابع به معنای عملیاتی کردن در همون لحظه نیست مثلا:
const lowerLetter= fucntion (str) { str.toLowerCase() }
ما لحظه ایکه از تابع .toLowerCase استفاده میکنیم میخوایم اون تابع رو عملیاتی کنیم پس صداش میکنیم برای همین هم هست که از () استفاده میکنیم اما برای استفاده از تابع lowerLetter باید با مفهوم callBack آشنابشیم:
جاوااسکریپت همیشه از این callback function ها داره استفاده میکنه مثلا زمانیکه ما از متد addEventListener یا forEach استفاده میکنیم. تابع زیر رو در نظر بگیرید:
const sayHello= funciton( ) { console.log( " hello "); }
حالا اگر بیایم و اون رو به عنوان یک آرگومان به تابع addEventListener بفرستیم:
btn.addEventListener ('click', sayHello)
یعنی به محض اینکه رویدادی click روی btn اتفاق افتاد addEventListener بیاد و مقدار تابع sayHello رو پاس بده یا توی مثال زیر:
["Peyman", "Reza", "Nima"].forEach(sayHello)
برنامه میاد و به تعداد عناصر موجود توی آرایه مقدار تابع sayHello رو پاس میده
اما چرا باید از call back function ها استفاده کرد؟
بهمون اجازه میده که کدهامون رو به اجزای کوچیک تر که بارها قابل استفاده هستن تبدیل کنیم
اما دلیل دوم و مهمتر اینه که ما میتونیم abstraction بسازیم
اما abstraction چیه؟
یعنی ما جزییات پیاده سازی کدها رو پنهان کنیم چون همه اون جزییات برای ما مهم نیستن بنابراین میتونیم به مسایل مهمتری توی کدمون بپردازیم به کد زیر توجه کنین:
const transformer = function (str, fn) { console.log(` Original strign: ${str}`); console.log(` Transformed strign: ${ fn ( str ) }`); }
حالا اگر ما بیایم و یک رشته ای به این تابع Transformer بدیم و یک تابع هم مثل onWord یا firstUpper هم به عنوان تابع براش مشخص کنیم:
transformer("Hi this is peyman", onWord) ======>>> hithisispeyman transformer("javascript is fun", firstUpper ) =======>>> JAVASCRIPT is fun
دیگه تابع transformer کاری نداره که توابعی که به صورت آرگومان بهش پاس داده میشن چطور قراره عملیات خودشون رو انجام بدن یا چه جزییاتی دخیل هستن ، تنها وظیفه ای که تابع transformer به عنوان یک تابع مرتبه بالا Higher-order function داره اینه که رشته رو بگیره و اون رو در اختیار توابعی که وظیفشون اعمال تغییرات روی اون رشته هستندقرار بده(اصطلاحا به این کار میگن deligate)
امیدوارم مفید بوده باشه