ফাংশন হলো সুসংগঠিত, পুনরায় ব্যবহারযোগ্য কোডের একটি ব্লক, যা দিয়ে কোনো কাজ করা হয়। JavaScript-এ ফাংশন ডিফাইন করার একাধিক উপায় আছে। এখানে আমরা ফাংশন ডিক্লারেশন ও ফাংশন এক্সপ্রেশন দেখব। অ্যারো ফাংশন-এর মতো অন্য সম্ভাবনাগুলো নিয়ে আলোচনা হবে অন্য কনসেপ্টে।
JavaScript-এ ফাংশন ডিফাইন করার মানক উপায় হলো ফাংশন ডিক্লারেশন, যাকে ফাংশন ডেফিনিশন বা ফাংশন স্টেটমেন্ট-ও বলা হয়।
এতে থাকে function কিওয়ার্ড, ফাংশনের নাম, এবং প্রথম বন্ধনীর ভেতরে কমা দিয়ে আলাদা করা প্যারামিটারগুলোর একটি তালিকা। এর পরে থাকে দ্বিতীয় বন্ধনীতে মোড়ানো ফাংশন বডি (স্টেটমেন্টের সমষ্টি, যা ঠিক করে ফাংশনটি কী কাজ করে)।
function someName(param1, param2, param3) {
// ...
}
JavaScript-এ কোনো ফাংশন ইনভোক (কল) করা হয় এভাবে: আগে ফাংশনের নাম লেখা হয়, তারপর প্রথম বন্ধনীর ভেতরে আর্গুমেন্টগুলো দেওয়া হয়।
someName(arg1, arg2, arg3);
ফাংশন বডির ভেতরে প্যারামিটার নিয়ে কাজ করার সময় সম্ভাব্য সাইড ইফেক্ট সম্পর্কে সতর্ক থাকুন।
ডিফল্টভাবে, ফাংশন ডিক্লারেশনে ডিফাইন করা সব প্যারামিটার JavaScript-এ ঐচ্ছিক। প্যারামিটারের চেয়ে কম আর্গুমেন্ট দিলে, বাদ পড়া আর্গুমেন্টগুলো ফাংশনের ভেতরে undefined হয়ে থাকবে, দেখুন Null ও Undefined। অনেক ক্ষেত্রেই undefined-এর বদলে আরও উপযুক্ত কোনো ডিফল্ট মান অ্যাসাইন করা বুদ্ধিমানের কাজ। ফাংশন ডেফিনিশনেই সরাসরি ডিফল্ট প্যারামিটার উল্লেখ করে এটা করা যায়।
function someName(param1 = defaultValue1, param2 = defaultValue2) {
// ...
}
return স্টেটমেন্ট ফাংশনের কার্যক্রম শেষ করে এবং ফাংশন কলকারীর কাছে যে মান রিটার্ন করা হবে তা নির্দিষ্ট করে। একটি ফাংশনে একাধিক return স্টেটমেন্ট থাকতে পারে।
function checkNumber(num) {
if (num === 0) {
return 'You passed 0, please provide another number.';
}
return 'Thanks for passing such a nice number.';
}
ফাংশনের রিটার্ন ভ্যালু একটি ভ্যারিয়েবলে রাখা যায়।
function sum(x, y) {
return x + y;
}
const total = sum(5, 10);
// => 15
যে ফাংশন কোনো মান return করে না বা যার return স্টেটমেন্ট নেই, তার ফলাফল undefined. JavaScript-এ কোনো অন্তর্নিহিত return নেই।
function nakedReturn(a) {
a * 2;
return;
}
nakedReturn(1);
// => undefined
function noReturn(a) {
a * 2;
}
noReturn(1);
// => undefined
JavaScript-এ আপনি ঠিক একটি মানই রিটার্ন করতে পারেন। আরও তথ্য পাঠাতে চাইলে প্রথমে সেগুলোকে একটি সত্তায় জোড়া লাগাতে হবে, সাধারণত কোনো অবজেক্ট বা অ্যারে-এ।
function divide(a, b) {
return {
quotient: Math.floor(a / b),
remainder: a % b,
};
}
ফাংশন ডিক্লারেশন একটি স্বতন্ত্র স্টেটমেন্ট। তবে কখনো কখনো অন্য একটি এক্সপ্রেশনের অংশ হিসেবে ফাংশন ডিফাইন করা কাজে লাগে, যেমন কোনো অ্যাসাইনমেন্টে, ফাংশন প্যারামিটার হিসেবে (কলব্যাক) বা কোনো অবজেক্টে মান হিসেবে। এটা করা যায় ফাংশন এক্সপ্রেশন দিয়ে। এর সিনট্যাক্স ফাংশন ডিক্লারেশনের মতোই, শুধু ফাংশনের নাম বাদ দিয়ে একটি অ্যানোনিমাস ফাংশন তৈরি করা যায়।
const someFunction = function (param) {
// ...
};
someOtherFunction(function (param) {
// ...
});
const obj = {
someFunction: function (param) {
// ...
},
};
এই অনুশীলনীতে, আপনি আপনার প্রিয় রান্নার বই থেকে আপনার চমৎকার লাসানিয়া প্রস্তুত ও রান্নার সাথে সম্পর্কিত আরও কিছু কোড লিখবেন।
আপনার পাঁচটি কাজ আছে। প্রথমটি রান্নার নিজের সাথে সম্পর্কিত, বাকি চারটি নিখুঁত প্রস্তুতি নিয়ে।
ওভেনে লাসানিয়া থাকলে, আপনি জানতে চান এটি এখনই বের করা যাবে কি না। ওভেনে লাসানিয়া যাতে পুড়ে না যায় তা নিশ্চিত করতে আপনি সাধারণত একটি টাইমার সেট করেন। কিন্তু মাঝে মাঝে আপনি সেটি ভুলে যান।
এমন একটি ফাংশন cookingStatus লিখুন যা প্যারামিটার হিসেবে টাইমারে বাকি থাকা সময়কে মিনিটে গ্রহণ করে।
ফাংশনটির তিনটি সম্ভাব্য ফলাফল আছে।
0 দেখালে, এটি 'Lasagna is done.' রিটার্ন করবে।'Not done, please wait.'।'You forgot to set the timer.'।টাইমার কখনো ০-এর কম কোনো মান দেখাবে না।
cookingStatus(12);
// => 'Not done, please wait.'
cookingStatus();
// => 'You forgot to set the timer.'
পরের যে লাসানিয়াটি আপনি প্রস্তুত করবেন, সেটির জন্য যথেষ্ট সময় বরাদ্দ আছে কি না আপনি নিশ্চিত করতে চান, যাতে রান্নাটা উপভোগ করতে পারেন। আপনি ইতিমধ্যেই আপনার লাসানিয়ার সব স্তর নিয়ে একটি পরিকল্পনা করেছেন। এখন সেটির ভিত্তিতে প্রস্তুতিতে কত সময় লাগবে তা আপনি অনুমান করতে চান।
এমন একটি ফাংশন preparationTime তৈরি করুন যা স্তরগুলোর একটি অ্যারে এবং প্রতি স্তরে গড় প্রস্তুতির সময় মিনিটে গ্রহণ করে।
ফাংশনটির উচিত স্তরের সংখ্যার ভিত্তিতে মোট প্রস্তুতির সময়ের অনুমান রিটার্ন করা।
গড় প্রস্তুতির সময় না দিয়ে ফাংশনটি কল করা হলে, পরিবর্তে 2 মিনিট ধরে নিতে হবে।
const layers = ['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles'];
preparationTime(layers, 3);
// => 18
preparationTime(layers);
// => 12
সময় বরাদ্দ করার পাশাপাশি, আপনার স্বপ্নের লাসানিয়া রান্নার জন্য যথেষ্ট সস ও নুডলস আছে কি না তাও আপনি নিশ্চিত করতে চান। আপনার লাসানিয়ার প্রতিটি নুডলস স্তরের জন্য ৫০ গ্রাম নুডলস লাগবে। আপনার লাসানিয়ার প্রতিটি সস স্তরের জন্য ০.২ লিটার সস লাগবে।
এমন একটি ফাংশন quantities ডিফাইন করুন যা প্যারামিটার হিসেবে স্তরগুলোর একটি অ্যারে নেয়।
এরপর ফাংশনটি আপনার খাবার তৈরির জন্য প্রয়োজনীয় নুডলস ও সসের পরিমাণ নির্ধারণ করবে।
ফলাফলটি noodles ও sauce কী (key) সহ একটি অবজেক্ট হিসেবে রিটার্ন করতে হবে।
quantities(['sauce', 'noodles', 'sauce', 'meat', 'mozzarella', 'noodles']);
// => { noodles: 100, sauce: 0.4 }
কিছুদিন আগে আপনি এক বন্ধুর বাড়িতে গিয়ে সেখানে লাসানিয়া খেয়েছিলেন। এটি অসাধারণ ছিল এবং এতে বিশেষ কিছু একটা ছিল। বন্ধু আপনাকে উপাদানের তালিকাটি পাঠিয়েছিলেন এবং বলেছিলেন, তালিকার শেষ জিনিসটিই "গোপন উপাদান" যা খাবারটিকে এত বিশেষ করে তুলেছিল। এখন আপনি সেই গোপন উপাদানটিও আপনার রেসিপিতে যোগ করতে চান।
এমন একটি ফাংশন addSecretIngredient লিখুন যা প্যারামিটার হিসেবে উপাদানের দুটি অ্যারে গ্রহণ করে।
প্রথম প্যারামিটার হলো আপনার বন্ধুর পাঠানো তালিকা এবং দ্বিতীয়টি আপনার নিজের রেসিপির উপাদানের তালিকা।
ফাংশনটির উচিত আপনার বন্ধুর তালিকার শেষ জিনিসটি আপনার তালিকার শেষে যোগ করা।
যে অ্যারেটি আপনার রেসিপির প্রতিনিধিত্ব করে সেটি সরাসরি পরিবর্তন করতে হবে এবং ফাংশনটির কিছুই রিটার্ন করা উচিত নয়।
তবে প্রথম আর্গুমেন্টটি পরিবর্তন করা উচিত নয়।
const friendsList = ['noodles', 'sauce', 'mozzarella', 'kampot pepper'];
const myList = ['noodles', 'meat', 'sauce', 'mozzarella'];
addSecretIngredient(friendsList, myList);
// => undefined
console.log(myList);
// => ['noodles', 'meat', 'sauce', 'mozzarella', 'kampot pepper']
আপনার রান্নার বইয়ে দেওয়া পরিমাণ দিয়ে কেবল দুটি পোরশনের জন্য যথেষ্ট লাসানিয়া হয়। যেহেতু পরের বার আপনি আরও মানুষের জন্য রান্না করতে চান, তাই আপনি বিভিন্ন সংখ্যার পোরশনের জন্য পরিমাণ হিসাব করতে চান।
এমন একটি ফাংশন scaleRecipe তৈরি করুন যা দুটি প্যারামিটার নেয়।
ফাংশনটির উচিত কাঙ্ক্ষিত সংখ্যার পোরশনের জন্য প্রয়োজনীয় পরিমাণসহ একটি রেসিপি অবজেক্ট রিটার্ন করা। তবে আপনি মূল রেসিপিটি রাখতে চান। এর মানে হলো, এই কাজে রেসিপি আর্গুমেন্টটি পরিবর্তন করা উচিত নয়।
const recipe = {
noodles: 200,
sauce: 0.5,
mozzarella: 1,
meat: 100,
};
scaleRecipe(recipe, 4);
// =>
// {
// noodles: 400,
// sauce: 1,
// mozzarella: 2,
// meat: 200,
// };
console.log(recipe);
// =>
// {
// noodles: 200,
// sauce: 0.5,
// mozzarella: 1,
// meat: 100,
// };
Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।