ফাংশন হলো সুসংগঠিত, পুনরায় ব্যবহারযোগ্য কোডের একটি ব্লক, যা দিয়ে কোনো কাজ করা হয়। JavaScript-এ ফাংশন ডিফাইন করার একাধিক উপায় আছে। এখানে আমরা ফাংশন ডিক্লারেশন এবং ফাংশন এক্সপ্রেশন দেখব। অ্যারো ফাংশন-এর মতো অন্যান্য সম্ভাবনা অন্য কনসেপ্টে আলোচনা করা হবে।
JavaScript-এ ফাংশন ডিফাইন করার আদর্শ উপায় হলো ফাংশন ডিক্লারেশন, যাকে ফাংশন ডেফিনিশন বা ফাংশন স্টেটমেন্ট-ও বলা হয়।
এটি গঠিত হয় function কিওয়ার্ড, ফাংশনের নাম এবং প্রথম বন্ধনীতে ঘেরা কমা দিয়ে আলাদা করা প্যারামিটারের একটি তালিকা নিয়ে।
এর পরে থাকে ফাংশন বডি (স্টেটমেন্টের সংগ্রহ, যা ঠিক করে ফাংশনটি কী কাজ করে), যা দ্বিতীয় বন্ধনীতে ঘেরা।
function someName(param1, param2, param3) {
// ...
}
JavaScript-এ কোনো ফাংশন ইনভোক করা হয় (কল করা হয়) ফাংশনের নাম লিখে, তারপর প্রথম বন্ধনীতে আর্গুমেন্ট দিয়ে।
someName(arg1, arg2, arg3);
শুধু ফাংশনের নাম লিখলেই JavaScript-এ ফাংশনটি কল হয় না।
function sayHello() {
console.log('Hello, World!');
}
sayHello;
// => [Function: sayHello]
// The text representations varies between environments.
sayHello();
// => 'Hello, World!'
ফাংশন বডির ভেতরে প্যারামিটার নিয়ে কাজ করার সময় মনে রাখবেন, ফাংশনে যে মূল মানটি পাঠানো হয়েছিল তার ওপর সাইড এফেক্ট থাকতে পারে। JavaScript-এ একটি আর্গুমেন্ট হলো মূল মানটির একটি রেফারেন্সের কপি। ব্যবহারে এর অর্থ কী হবে, তা নির্ভর করে আর্গুমেন্টের ডেটা টাইপের ওপর।
প্রিমিটিভ ডেটা টাইপ-এর মান ইমিউটেবল। সব "পরিবর্তন" সবসময়ই একটি নতুন প্রিমিটিভ মান তৈরি করে। তাই ফাংশন বডিতে আর্গুমেন্টের যা হয়, তাতে মূল মান কখনোই প্রভাবিত হয় না।
const num = 0;
function increase(number) {
number = number + 1;
}
increase(num);
num;
// => 0
অবজেক্ট, অ্যারে, ফাংশন-এর মতো মানের ক্ষেত্রে ব্যাপারটা আলাদা। যেহেতু রেফারেন্সটি কপি করা হয়, তাই পুনরায় অ্যাসাইনমেন্ট করলে মূল মান প্রভাবিত হয় না। তবে, যেহেতু আপনি একটি শ্যালো কপি নিয়ে কাজ করছেন, ফাংশন বডিতে আর্গুমেন্ট পরিবর্তন করলে যে মূল মানটি পাঠানো হয়েছিল সেটিও বদলে যাবে।
const nums = [0, 1, 2, 3, 4];
function pushFive(arr) {
arr.push(5);
}
pushFive(nums);
nums;
// => [0, 1, 2, 3, 4, 5]
ডিফল্টভাবে, JavaScript-এ ফাংশন ডিক্লারেশনে ডিফাইন করা সব প্যারামিটারই অপশনাল।
কোনো ফাংশনে প্যারামিটারের চেয়ে কম আর্গুমেন্ট দেওয়া হলে, অনুপস্থিত আর্গুমেন্টগুলো ফাংশন বডির ভেতরে undefined হবে, দেখুন নাল ও আনডিফাইন্ড।
অনেক ক্ষেত্রে, কোনো মান বা undefined প্রপার্টি পাঠানো না হলে একটি প্যারামিটারকে ডিফল্ট মান দিয়ে ইনিশিয়ালাইজ করা বেশি যুক্তিসঙ্গত।
এটি করা যায় ফাংশন ডেফিনিশনে সরাসরি ডিফল্ট প্যারামিটার উল্লেখ করে।
function someName(param1 = defaultValue1, param2 = defaultValue2) {
// ...
}
ফাংশন ডেফিনিশনে যত প্যারামিটার ছিল, তার চেয়ে বেশি আর্গুমেন্ট দিয়ে একটি ফাংশন ইনভোক করা যায় (কল করা যায়)। সব আর্গুমেন্ট, এমনকি বাড়তি আর্গুমেন্টগুলোও, arguments "অ্যারে"-এ পাওয়া যায়।
এমন ফাংশনও ডিফাইন করা যায় যারা যেকোনো সংখ্যক আর্গুমেন্ট নিতে পারে (ভ্যারিয়াডিক ফাংশন); আরও বিস্তারিত জানতে রেস্ট ও স্প্রেড অপারেটর-এ রেস্ট প্যারামিটার দেখুন।
একটি return স্টেটমেন্ট ফাংশনের এক্সিকিউশন শেষ করে এবং ফাংশনের কলারকে যে মান রিটার্ন করা হবে তা নির্দিষ্ট করে। একটি ফাংশনে একাধিক return স্টেটমেন্ট থাকতে পারে।
function checkNumber(num) {
if (num === 0) {
return 'You passed 0, please provide another number.';
}
return 'Thanks for passing such a nice number.';
}
যে ফাংশন কোনো মান 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) {
// ...
},
};
একটি ফাংশন JavaScript-এ একটি নতুন এক্সিকিউশন কনটেক্সট তৈরি করে। ফাংশনের ভেতরে ডিফাইন করা ভ্যারিয়েবল ওই ফাংশনের বাইরে থেকে অ্যাক্সেস করা যায় না। তবে প্যারেন্ট স্কোপে (যে স্কোপে ফাংশনটি নিজে ডিফাইন করা হয়েছিল) ডিফাইন করা ভ্যারিয়েবল ফাংশনের ভেতরে অ্যাক্সেস করা যায়। স্কোপ নিয়ে MDN ডকুমেন্টেশন-এ এই আচরণের উদাহরণ দেখানো হয়েছে।
JavaScript-এ ভ্যারিয়েবল স্কোপ সম্পর্কে আরও জানতে ক্লোজার দেখুন।