Lesson ৮ মিনিট পড়া

ফাংশন (Functions)

আপনার কোডগুলোকে একটি বারবার ব্যবহারযোগ্য বাক্সে মুড়িয়ে রাখুন এবং প্রয়োজন মতো সেটিকে ডাকুন

ফাংশন কী? (What Are Functions?)

একটি ফাংশন অনেকটা রেসিপি কার্ডের (recipe card) মতো। আপনি একবার এর জন্য নির্দেশ বা ইন্সট্রাকশন লিখে সেটির একটি নাম দিয়ে দিলেন, এরপর চাইলে যেকোনো সময় সেই নাম ধরে ডেকে রেসিপিটি অনুযায়ী "রান্না" করতে পারেন। আপনি চাইলে এর মাঝে উপকরণও (যা প্যারামিটার (parameters) নামে পরিচিত) পাঠাতে পারেন, যা বিনিময়ে আপনাকে একটি তৈরি খাবার (বা রিটার্ন ভ্যালু (return value)) ফেরত দেবে।

ফাংশনগুলোই হলো জাভাস্ক্রিপ্টের মেরুদণ্ড। এগুলো আপনাকে সাহায্য করে:

  • বারবার একই জিনিস লেখা বা রিপিটেশন (repetition) এড়াতে — একবার লিখুন, যেখানে খুশি ব্যবহার করুন
  • কোডগুলোকে গোছাতে — বড় কোনো সমস্যাকে ছোট ছোট নাম দেওয়া অংশে ভাগ করে নিতে
  • অ্যাবস্ট্রাকশন (abstractions) তৈরি করতে — একটি ছোট ও পরিষ্কার নামের আড়ালে পেছনের হাবিজাবি কোডগুলোকে লুকিয়ে রাখতে

জাভাস্ক্রিপ্টে মূলত তিনটি উপায়ে ফাংশন তৈরি করা যায়: ডিক্লেয়ারেশন (declarations), এক্সপ্রেশন (expressions), এবং অ্যারো ফাংশন (arrow functions)

ফাংশন তৈরি করার তিনটি উপায় (Three Ways to Create Functions)

// 1. Function Declaration — the classic way
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet("Kaisar")); // "Hello, Kaisar!"
// 2. Function Expression — stored in a variable
const double = function(n) {
return n * 2;
};
console.log(double(7)); // 14
// 3. Arrow Function — modern & concise
const triple = (n) => n * 3; // implicit return for single expressions
console.log(triple(5)); // 15
// Arrow with a body (needs explicit return)
const describe = (name, age) => {
let status = age >= 18 ? "adult" : "minor";
return `${name} is a ${status}`;
};
console.log(describe("Mia", 15)); // "Mia is a minor"
Output
Hello, Kaisar!
14
15
Mia is a minor

প্যারামিটার — ডিফল্ট ভ্যালু এবং রেস্ট (Parameters — Default Values & Rest)

আপনি যদি কোনো ভ্যালু প্রদান করা ভুলে যান, তবে ডিফল্ট প্যারামিটার (Default parameters) আপনাকে একটি বিকল্প ভ্যালু (fallback value) ঠিক করে দেওয়ার সুযোগ দেয়। এটিকে একটি দাওয়াত বা মেজবানের সাথে তুলনা করতে পারেন, যেখানে আপনি নির্দিষ্ট করে কিছু না বললেও তারা নিজে থেকে আপনার জন্য পানি বা লবণ দিয়ে যায়।

রেস্ট প্যারামিটার (Rest parameters) (...args) যেকোনো সংখ্যক আর্গুমেন্ট সংগ্রহ করে একটিমাত্র অ্যারেতে জমা করে রাখে। যখন আপনি আগে থেকে জানেন না যে কতগুলো ইনপুট আসবে বা পাওয়া যাবে, তখন এটি বেশ দারুণ কাজে দেয়।

ডিফল্ট এবং রেস্ট প্যারামিটার (Default & Rest Parameters)

// Default parameters
function createUser(name, role = "viewer") {
return { name, role };
}
console.log(createUser("Asif")); // { name: "Asif", role: "viewer" }
console.log(createUser("Asif", "admin")); // { name: "Asif", role: "admin" }
// Rest parameters (...) — gather remaining args into an array
function sum(...numbers) {
let total = 0;
for (let n of numbers) total += n;
return total;
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(10, 20, 30, 40)); // 100
// Mixing regular and rest params
function announce(action, ...items) {
console.log(`${action}: ${items.join(", ")}`);
}
announce("Bought", "milk", "bread", "eggs");
Output
{ name: "Asif", role: "viewer" }
{ name: "Asif", role: "admin" }
6
100
Bought: milk, bread, eggs

ফাংশনগুলোও এক ধরনের ভ্যালু — এগুলোকে যেকোনো জায়গায় পাস করা যায় (Functions Are Values — Passing Them Around)

জাভাস্ক্রিপ্টের ক্ষেত্রে ফাংশনগুলো হলো ফার্স্ট-ক্লাস ভ্যালু বা প্রথম শ্রেণীর নাগরিক (first-class values)। অর্থাৎ আপনি চাইলে সেগুলোকে ভ্যারিয়েবলে সংরক্ষণ করতে পারেন, অন্যান্য ফাংশনের আর্গুমেন্ট হিসেবে পাস করতে পারেন এবং কোনো ফাংশন থেকে ফাংশনকে রিটার্নও করতে পারেন। এই সুবিধাটিই জাভাস্ক্রিপ্টকে এত বেশি ফ্লেক্সিবল (flexible) বা সাবলীল করে তুলেছে।

যেসব ফাংশন অন্য কোনো ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করে (অথবা ফাংশন রিটার্ন করে), সেগুলোকে হাইয়ার-অর্ডার ফাংশন (higher-order function) বলা হয়। এগুলো আপনি প্রায় সব জায়গাতেই দেখতে পাবেন — যেমন setTimeout, addEventListener, এবং .map() বা .filter() এর মতো অ্যারে মেথডসমূহ।

ভ্যালু হিসেবে ফাংশন এবং ক্লোজারের ভূমিকা (Functions as Values & Closures Intro)

// Passing a function as an argument
function repeat(n, action) {
for (let i = 0; i < n; i++) {
action(i);
}
}
repeat(3, (i) => console.log(`Step ${i}`));
// Returning a function — this creates a CLOSURE
function createMultiplier(factor) {
return (number) => number * factor;
}
const timesFive = createMultiplier(5);
const timesTen = createMultiplier(10);
console.log(timesFive(3)); // 15
console.log(timesTen(3)); // 30
// The returned function "remembers" the factor!
// This is a closure — more on this in the closures lesson.
// Functions in objects (callbacks)
setTimeout(() => console.log("Delayed!"), 0);
console.log("Immediate!");
Output
Step 0
Step 1
Step 2
15
30
Immediate!
Delayed!
Note: সাধারণ ফাংশনের চেয়ে অ্যারো ফাংশনের মধ্যে একটি বড় পার্থক্য রয়েছে: অ্যারো ফাংশনের নিজস্ব কোনো 'this' নেই। এগুলো নিজেদের তৈরি হওয়ার জায়গা থেকেই 'this' উত্তরাধিকার সূত্রে পেয়ে থাকে বা ইনহেরিট (inherit) করে। এ কারণে এগুলো কলব্যাকের (callback) জন্য বেশ কার্যকরী হলেও, অবজেক্ট মেথড হিসেবে ব্যবহার করতে গেলে কিছুটা ঝামেলা তৈরি করতে পারে। তাই কোনো সন্দেহ থাকলে বা যখনই আপনার 'this'-এর প্রয়োজন হবে, তখনই সাধারণ ফাংশন ব্যবহার করবেন।
চ্যালেঞ্জ

ছোট কুইজ

অ্যারো ফাংশন (x) => x * x কে 4 দিয়ে কল বা রান করা হলে, এটি কী রিটার্ন করবে?
ObjectsArray Higher-Order Methods