জাভাস্ক্রিপ্ট: ফাংশনের আর্গুমেন্ট যখন ফাংশন!
জাভাস্ক্রিপ্টে একটা খুবই কমন জিনিস হলো, কোন কোন ফাংশনে আর্গুমেন্ট হিসেবে সরাসরি একটি ফাংশনকেই পাস করে দেওয়া হয়। একদম প্রথম দিকে জাভাস্ক্রিপ্ট নিয়ে ঘাটাঘাটি করার সময় আমাকে প্রচন্ড কনফিউজ করে ফেলতো এই জিনিসটি। আসুন একটু কনফিউশন মুক্ত হবার চেষ্টা করে দেখি! প্রথমে একটা সাধারণ ফাংশন দেখি।
function writeDown(text) {
console.log(text);
}
খুবই সিম্পল ফাংশন, যা একটি text আর্গুমেন্ট নিয়ে তা কনসোলে প্রিন্ট করে। আমরা সাধারণত কোন স্ট্রিং, নাম্বার ইত্যাদি আর্গুমেন্ট হিসেবে নিয়ে থাকি। কিন্তু মজার ব্যাপার হল আমরা আস্ত একটা ফাংশনকেই আর্গুমেন্ট হিসেবে নিতে পারি! যেমন নিচের উদাহরণটি দেখি।
function writeDown(functionName) {
functionName("This is fun!");
}
ফাংশনটা অদ্ভুদ লাগছে? হ্যাঁ, আমরা writeDown ফাংশনটির মধ্যে functionName আর্গুমেন্টের কাছে “This is fun!” স্ট্রিংটিকে কে পাস করে দিচ্ছি । এবার functionName হিসেবে console.log কে writeDown এর কাছে পাস করে দেখি কি হয়!
writeDown(console.log);
হ্যাঁ, কনসোলে কিন্তু “This is fun!” প্রিন্ট হবে। এবার আরেকটু উন্নতমানের ফাংশনে (!) মনযোগ দেই।
function writeDown(functionName, text) {
functionName(text);
}
বুঝে গেছেন তাহলে, এইবার text ও আর্গুমেন্ট হিসেবে নিবো, রকেট সায়েন্সের পাঠ্য না। এইবার সিমপ্লি আরও এক্সট্রা একটা স্ট্রিং আর্গুমেন্ট পাস করে দিই writeDown কে।
writeDown(console.log, "Hello, Funky JavaScript!");
এবার নিজেদের বানানো ফাংশন নিয়ে একটু গুতোগুতি করি, অনেক হল সেই আদি ও আসল console.log কে নিয়ে। একটা খুবই সিম্পল ফাংশন তৈরি করি addUs, যা দুইটি সংখ্যা ইনপুট নিয়ে যোগ করবে। আরেকটি ফাংশন execute নিই, যা addUs কে আর্গুমেন্ট হিসেবে নিয়ে এক্সিকিউট করবে।
function addUs(num1, num2) {
return num1 + num2;
}
function execute(functionName, value1, value2) {
return functionName(value1, value2);
}
console.log(execute(addUs, 1, 2)); // not rocket science
কনসোলে 3 লগ হবে। এইবার একটু সময় নিয়ে ব্যাপারটাকে হজম করি। হজম হল? এইবার আরেকটু অন্যভাবে জিনিসটাকে দেখি। আমরা তো addUs ফাংশনটিকে এভাবেও লিখতে পারতাম, তাই না?
var addUs = function(num1, num2) {
return num1 + num2;
};
এক্ষেত্রে আমরা বলতে পারি, addUs একটি ভ্যারিয়েবল যা একটি ফাংশনকে “ধারণ” করছে, তাই না? আমরা তো জানি আমরা যখন ফাংশনে কোন ভ্যারিয়েবলের নাম পাস করি, সেই ভ্যারিয়েবলের ভ্যালুটি পাওয়া যায়, তাহলে আমরা execute(addUs, 1, 2) লেখার মাধ্যমে addUs ভ্যারিয়েবলটিতে “রাখা” ফাংশনটিকেই প্রকৃতপক্ষে ডাকাডাকি করছি। কিন্তু, সবচেয়ে মজার ব্যাপার হল, আমরা Addition Program টাকে এভাবেও কি লিখতে পারতাম না? একটু ভালো করে লক্ষ্য করি!
function execute(functionName, value1, value2) {
return functionName(value1, value2);
}
console.log(execute(function (num1, num2) {
return num1 + num2;
}, 1, 2));
এইখানে কিন্তু আমরা addUs কে যেখানে উল্লেখ করা হয়েছিল, সেখানেই addUs এর ভ্যালু অর্থাৎ গোটা ফাংশনটা লিখে দিয়েছি, আর কিছুই করিনি। এইভাবে আমরা সরাসরি একটা ফাংশন জায়গায় দাঁড়িয়ে লিখে দিতে পারি! এবার আপনিও আপনার ব্রাউজার কনসোলে এই জিনিসটি নিয়ে একটু নাড়াচাড়া করে দেখতে পারেন।