جاوااسكريپت براي اجراي كدهاي خود، بصورت نرمال دستورات را خط به خط تفسير واجرا مي نمايد يعني ابتدا تمام برنامه را كمپايل وبعدا اجرا نميكند .اگر در ترتيب تفسير واجرا توالي ،دستورات نياز به توقف اجرا نداشته باشد، كار ساده تر است ، اما در دنياي واقعي هم اينطورنيست كه فعاليت ها زنجيروار بدون نياز به حلقه هاي بعدي انجام شوند .عمليات موازي و نياز عمليات به حلقه بعدي وجود دارد ومديريت آنهم، از روال معمول پيچيده تر خواهد بود.
بسياري از دستورات وبلوكهاي كدي را مطابق نحوي معمولش جاوااسكريپت تفسير واجراميكند .اما بعضي از موارد را برنامه نويس براي بهره دهي بهتر و اجراي بدون مشكل بايد مديريت سخت تري اعمال نمايد .دراين بخش وسه بخش بعدي موارد پيچيده تر بحث ميشود.
اصطلاحcallbak به توابعي گفته ميشود كه آنها بعنوان آرگومان در يك تابع ديگر فراخوان ميشوند . اين تكنيك يا روش اجازه ميدهد كه تابعي بعنوان آرگومان در تابع ديگر استفاده شود.
تابعي كه براي آرگومان خود ، تابع ديگر را فراخوان ميكند بايد منتظر بماند، تاپاسخ برگشت را از تابع آرگوماني دريافت كند و كار خود را ادامه دهد.
توابع جاوااسكريپت به ترتيپ فراخواني اجرا ميشوند، نه به ترتيب تعريف شده.
مثال ـ اين مثال در نهايت"Goodbye" را نمايش ميدهد .
function myFirst() { myDisplayer("Hello"); } function mySecond() { myDisplayer("Goodbye"); } myFirst(); mySecond();
مثال ـ اين مثال در انتها پيغام"Hello" نمايش ميدهد
function myFirst() { myDisplayer("Hello"); } function mySecond() { myDisplayer("Goodbye"); } mySecond(); myFirst();
در دو مثال فوق مشخص شد كه ترتيب تعاريف توابغ هييچ نقشي در ترتيب اجرا ندارد.
گاهي اوقات مناسب است كه كنترل بهتري روي زمان اجراي يك تابع داشته باشيد .فرض كنيد كه ميخواهيم محاسبه اي انجام ونتيجه آن نمايش داده شود.
ميتوان ابتدا تابعي بنامmyCalculate اجرا نموده ونتيجه آنرا ذخيره كرد .سپس تابع ديگري مثلmyDisplay براي نمايش نتيجه ذخيره شده استفاده نمود .
مثال ـ برنامه محاسبه ونمايش مطابق روند فوق
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } function myCalculator(num1, num2) { let sum = num1 + num2; return sum; } let result = myCalculator(5, 5); myDisplayer(result);
يا همان مورد را با فراخواني تابعmyDisplay در تابعmyCalculate مطابق مثال زير:
مثال ـ روش دوم نمايش محاسبه
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } function myCalculator(num1, num2) { let sum = num1 + num2; myDisplayer(sum); } myCalculator(5, 5);
مسئله براي مثال اول اين است كه براي نمايش نتيجه بايد دوتابع فراخواني شوند .اما در مثال دوم نمي توان عملكرد تابعmyCalculaor را براي محاسبه در نمايش جلوگيري كرد .
اكنون لازم است كه در مورد توابع برگشتي(callbak) بحث شود .
يك كال بك تابعي است كه مشابه يك آرگومان در يك تابع ديگر ارسال ميشود.
با استفاده ازيكcallback ميتوان تابعmyCalculator را با يك تابعmyCallbak فراخوان كرد و تابعmyCalculator اجازه دارد پس از پايان محاسبه، پاسخ myCallbak را اجرا كند .
function myDisplayer(some) { document.getElementById("demo").innerHTML = some; } function myCalculator(num1, num2, myCallback) { let sum = num1 + num2; myCallback(sum); } myCalculator(5, 5, myDisplayer);
در مثال بالاmyDisplay تابع كال بك ميباشد . آن تابع بعنوان آرگومان براي تابعmyCalculator ارسال شده است .
توجه ـ هنگاميكه يك تابع بعنوان يك آرگومان ارسال ميشود، پرانتز بازوبسته ندارد .نحوي درست مطابق زيراست.
مثال ـ حذف اعداد منفي از آرايه بااستفاذه ازتابع كال بك
// Create an Array const myNumbers = [4, 1, -20, -7, 5, 9, -6]; // Call removeNeg with a callback const posNumbers = removeNeg(myNumbers, (x) => x >= 0); // Display Result document.getElementById("demo").innerHTML = posNumbers; // Keep only positive numbers function removeNeg(numbers, callback) { const myArray = []; for (const x of numbers) { if (callback(x)) { myArray.push(x); } } return myArray; }
مثالهاي بالا براي كال بك خيلي مورد توجه نيستند، اما براي ارائه ساده تر مطالب استفاده شده است.
در حالتي تك تابع بايد منتظر پايان كار تابع ديگر بماند مثال انتظار براي بارگيري فايل، تابع كال بك كابرد دارند.
در مورد توابع ناهمزمان در فصل بعدي پوشش داده ميشود.