कॉलबैक फंक्शन ऐसे फंक्शन होते हैं जिन्हें दूसरे फंक्शन को आर्गुमेंट के रूप में भेजा जाता है। इसके बाद उस कॉलबैक फंक्शन को कॉल करके कोई अगला काम शुरू किया जा सकता है। अक्सर कॉलबैक का उपयोग किए गए काम के नतीजे संभालने में किया जाता है, या फिर कोई इवेंट होने पर उस पर कार्रवाई करने में। कॉलबैक फंक्शन का इस्तेमाल सिंक्रोनस और असिंक्रोनस, दोनों तरह की प्रोग्रामिंग में किया जा सकता है।
const sideLength = 5;
// Caller function takes a callback function
function applySideLength(callback) {
return callback(sideLength);
}
// Callback must expect the possible argument from the calling function
function areaOfSquare(side) {
return side * side;
}
applySideLength(areaOfSquare); // => 25
आप कॉलबैक को फंक्शन एक्सप्रेशन के रूप में भी लिख सकते हैं:
applySideLength(function squarePerimeter(side) {
return side * 4;
});
JavaScript में यह तरीका बहुत काम का है, क्योंकि JavaScript एक सिंगल-थ्रेडेड रनटाइम है, जहाँ एक समय में एक ही फंक्शन कॉल चल सकता है। जब तक वह फंक्शन लौट न जाए, रनटाइम न दूसरे इवेंट का जवाब दे सकता है और न ही आगे चल सकता है।
बहुत सारे API कॉल (जैसे I/O फंक्शन, टाइमर और इवेंट लिसनर) असिंक्रोनस तरीका अपनाते हैं और मौजूदा फंक्शन कॉल को तब तक एक तरफ रख देते हैं, जब तक काम पूरा न हो जाए। काम पूरा होने पर कॉलबैक फंक्शन को मैसेज क्यू में डाल दिया जाता है। इस तरह जब रनटाइम दो फंक्शन कॉल के बीच खाली होता है, तब उन मैसेजों को कॉलबैक फंक्शन कॉल करके संसाधित किया जाता है।
कॉलबैक फंक्शन इस्तेमाल करना इसलिए भी काम का है, क्योंकि ये अपने क्लोज़र स्कोप के उन वेरिएबल का इस्तेमाल कर सकते हैं, जो उस फंक्शन के लिए उपलब्ध नहीं होते जहाँ इन्हें बाद में कॉल किया जाता है।
JavaScript में इवेंट हैंडलर कॉलबैक का एक आम उपयोग है। ब्राउज़र के 'onload' या 'onclick' जैसे इवेंट ऐसे सिग्नल हैं जिन पर फंक्शन कॉल किए जा सकते हैं। DOM [Document Object Model ऑब्जेक्ट का addEventListener मेथड एक कॉलबैक फंक्शन रजिस्टर करता है, ताकि जब उसे कोई इवेंट हुआ "सुनाई" दे, तो वह फंक्शन कॉल किया जाए।
document.addEventListener('onload', function () {
alert('The webpage has now been loaded');
});
Node.js में कॉलबैक फंक्शन प्रोग्राम का फ्लो नियंत्रित करने के लिए एक कन्वेंशन का पालन करते हैं। इनका तरीका यह है: कॉलबैक फंक्शन का पहला आर्गुमेंट Error या null ले सकता है। दूसरे और उसके बाद के आर्गुमेंट वह डेटा लेते हैं जो कॉल करने वाला फंक्शन भेजने के लिए बना है।
अगर कोई एरर आती है, तो दूसरा और उसके बाद के आर्गुमेंट मौजूद नहीं भी हो सकते हैं, इसलिए आप यह न मानकर चलिए कि वे होंगे ही।
function operation(a, b, callback) {
// Work ...
if (/* an error occurs */) {
return callback(new Error('An error occurred'))
}
// On success:
callback(null, data)
}
function callback(error, returnedData) {
if (error) {
// An error occurred, handle it here.
return
}
// No error occurred, continue with the returned data.
}
operation(1, 2, callback)
फ्लो नियंत्रित करने के लिए असिंक्रोनस फंक्शन के साथ काम करते समय आपको यह तरीका अक्सर दिखता है।
Array के आम फंक्शन अपना व्यवहार तय करने के लिए कॉलबैक फंक्शन का इस्तेमाल करते हैं:
Array.prototype.forEach:
एक कॉलबैक लेता है, जिसे वह ऐरे के हर एलिमेंट पर लागू करता है।
[1, 2, 3].forEach(function (element) {
doSomething(element);
});
// => doSomething() is invoked 3 times, once with each element
Array.prototype.map
एक कॉलबैक लेता है, जिसे वह ऐरे के हर एलिमेंट पर लागू करता है और नतीजे से एक नया ऐरे बनाता है।
[1, 2, 3].map(function (element) {
return element + 1;
});
// => [2, 3, 4]
Array.prototype.reduce
एक कॉलबैक लेता है, जिसे वह ऐरे के हर एलिमेंट पर लागू करता है और नतीजे को अगली बार चलने पर आगे भेज देता है।
[1, 2, 3].reduce(function (runningSum, element) {
return runningSum + element;
}, 0);
// => 6