Q5. Explain how closures work in JavaScript with an example.
ফাংশন কীভাবে বাইরের scope-এর ভেরিয়েবল মনে রাখে — counter ও loop-এর উদাহরণসহ।
Closure মানে একটি function তার বাইরের scope-এর ভেরিয়েবল মনে রাখে এবং সেগুলো ব্যবহার করতে পারে — তখনই যখন function-টি ডাকা হয়, যদিও বাইরের scope তখন শেষ হয়ে গেছে।
function createCounter() {
let count = 0; // বাইরের scope-এর ভেরিয়েবল
return function increment() {
count = count + 1;
return count;
};
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
console.log(counter()); // 3ধাপে ধাপে দেখি। createCounter() ডাকলে count = 0 তৈরি হয়, তারপর ভেতরের ফাংশনটি ফেরত দেওয়া হয়। বাইরের ফাংশন শেষ হয়ে গেলেও count মুছে যায় না — কারণ ফেরত দেওয়া ফাংশনটি তার রেফারেন্স ধরে রাখে। এই ধরে রাখাই closure।
তাই counter() বারবার ডাকলেও count একই থাকে এবং ধাপে ধাপে বাড়ে — প্রতিটি কলে 0 থেকে নতুন করে শুরু হয় না।
var ব্যবহার করলে সমস্যা হয়, কারণ var একটি shared ভেরিয়েবল — তাই সবসময় শেষের মান দেখাবে।
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 3, 3, 3 ❌
}
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i)); // 0, 1, 2 ✅
}Closure-ই event listener-এর ভিতরের state ধরে রাখা, counter বানানো, cache তৈরি এবং পুরোনো ধরনের private variable বানানোর পেছনে কাজ করে।