JavaScript Functions: Intermediate
Arrow function, callback, higher-order function, anonymous function, IIFE, rest parameter — বাংলায়।
প্রথম ধাপে ফাংশনের ভিত্তি শেখা। এবার first-class ফাংশন ব্যবহারের কৌশল — arrow, callback, higher-order — যা রিয়েল অ্যাপের প্রতিদিনের হাতিয়ার।
Arrow function
// পূর্ণ arrow
const add = (a, b) => {
return a + b;
};
// এক-expression সংক্ষিপ্ত (implicit return)
const multiply = (a, b) => a * b;
// এক parameter হলে parenthesis বাদ
const square = x => x * x;
console.log(add(3, 5)); // 8
console.log(multiply(4, 5)); // 20
console.log(square(9)); // 81Arrow function সংক্ষিপ্ত এবং this-এর আচরণ আলাদা (মনে রাখবেন — advanced অধ্যায়ে in depth)। এক-expression return হলে {} আরের return বাদ যায়।
Callback function
function process(value, callback) {
const doubled = value * 2;
callback(doubled);
}
process(5, (result) => {
console.log("ফলাফল:", result); // ফলাফল: 10
});callback হলো অন্য ফাংশনে প্যারামিটার হিসেবে পাঠানো ফাংশন — যা পরে ডাকা হবে। অ্যারে মেথড (map, forEach), ইভেন্ট, async API — সব জায়গায় callback।
Higher-order function
// ফাংশন দিয়ে ফাংশন বানানোর এমন ফাংশন
function makeAdder(x) {
return function (y) {
return x + y;
};
}
const add5 = makeAdder(5);
console.log(add5(3)); // 8
console.log(add5(10)); // 15যে ফাংশন অন্যটিকে argument-এ নেয় কিংবা ফাংশন ফেরত দেয় — সেটি higher-order function। Array.map, setTimeout, arr.sort((a,b)=>...) — সব higher-order।
Anonymous function
// নামবিহীন ফাংশন — সরাসরি ব্যবহার
setTimeout(function () {
console.log("২ সেকেন্ড পর");
}, 2000);
// arrow anonymous
const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2);
console.log(doubled); // [2, 4, 6]anonymous মানে নামবিহীন — সাধারণত এক-জায়গায় ব্যবহারের হলে callback/method-এ দেওয়া হয়।
IIFE — সাথে সাথেই চালানো
(function () {
const secret = "গোপন";
console.log("এখনই চলে", secret);
})();
// arrow version
(() => {
console.log("তাত্ক্ষণিক");
})();
// IIFE-র ভেতরের variable বাইরে অ্যাক্সেস করা যায় না
// console.log(secret); // ReferenceErrorIIFE (Immediately Invoked Function Expression) — তৈরির সাথে সাথে নিজে চলে। বাইরে থেকে ভেতরের variable এড়াতে old-school pattern, এখন module/block scope-এর যুগে কম দরকার।
Rest parameter (...args)
function sumAll(...numbers) {
return numbers.reduce((sum, n) => sum + n, 0);
}
console.log(sumAll(1, 2, 3)); // 6
console.log(sumAll(10, 20)); // 30
console.log(sumAll()); // 0rest (`...`) — যত ইচ্ছা argument সব একটি array-তে জমা করে। নাম পরিচিত: function-এ parameter-এ ... = rest, অন্য জায়গায় array/object ফেলা = spread।
function greet(prefix, ...names) {
return names.map(n => prefix + " " + n).join(", ");
}
console.log(greet("নমস্কার", "রহিম", "করিম", "সুমন")); // নমস্কার রহিম, নমস্কার করিম, নমস্কার সুমনarguments (পুরনো)
function show() {
console.log(arguments[0], arguments.length);
}
show("রহিম", "করিম"); // রহিম 2
// আধুনিক পছন্দ: rest parameter
function showRest(first, ...rest) {
console.log(first, rest.length);
}
showRest("রহিম", "করিম"); // রহিম 1| কৌশল | কাজ |
|---|---|
arrow () => x | সংক্ষিপ্ত + implicit return |
| callback | argument-এ পাঠানো ফাংশন |
| higher-order | ফাংশন নেয়/ফেরত দেয় |
| anonymous | নামহীন, এক-জায়গা |
| IIFE | তৈরির মুহূর্তে চলে |
rest ... | সব argument এক array-তে |
Arrow function-এর নিজের this নেই — lexical scope-এর this নেয়। object method-এ arrow ব্যবহার না করে regular function-ই ব্যবহার করুন।
allEven(...nums) ফাংশন লিখুন যা সবগুলো number জোড় কি না বলবে। IIFE দিয়ে একবার console-এ চালান।