JavaScript Closures – বাংলায় সহজ ব্যাখ্যা
Closure হলো JavaScript-এর একটি শক্তিশালী বৈশিষ্ট্য, যা একটি ফাংশনকে তার পারেন্ট ফাংশনের স্কোপ (পরিসর) সহ স্মরণ রাখতে দেয়, এমনকি পারেন্ট ফাংশন রিটার্ন করার পরও।
অর্থাৎ, একটি ফাংশন তার বাইরের ভেরিয়েবলগুলো অ্যাক্সেস করতে পারে এমন অবস্থা — এটাকেই Closure বলে।
1. Closure কী এবং কেন প্রয়োজন?
যখন আপনি একটি ফাংশনের ভিতরে আরেকটি ফাংশন তৈরি করেন, এবং ভিতরের ফাংশনটি বাইরের ফাংশনের ভেরিয়েবল ব্যবহার করে, তখন Closure তৈরি হয়।
এটি ডাটা এনক্যাপসুলেশন এবং প্রাইভেসি (private variables) তৈরিতে সাহায্য করে।
2. সহজ উদাহরণ
function outer() {
let count = 0;
function inner() {
count++;
return count;
}
return inner;
}
const counter = outer();
console.log(counter()); // আউটপুট: 1
console.log(counter()); // আউটপুট: 2
console.log(counter()); // আউটপুট: 3
এখানে outer() ফাংশনটি একটি inner() ফাংশন রিটার্ন করছে, যা বাইরের count ভেরিয়েবল অ্যাক্সেস করে।
counter() যখনই কল হয়, আগের মান স্মরণ রেখে বাড়ায় — এটা Closure-এর কাজ।
3. Closure কেন গুরুত্বপূর্ণ?
- ডাটা প্রাইভেসি বজায় রাখে।
- স্টেট মেইনটেইন করে ফাংশনের মাধ্যমে।
- মেমোরি ম্যানেজমেন্টে সাহায্য করে।
4. Closure-এর আরেকটি উদাহরণ – প্রাইভেট ভেরিয়েবল
function createCounter() {
let count = 0;
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
},
getCount: function() {
return count;
}
};
}
const myCounter = createCounter();
console.log(myCounter.increment()); // আউটপুট: 1
console.log(myCounter.increment()); // আউটপুট: 2
console.log(myCounter.decrement()); // আউটপুট: 1
console.log(myCounter.getCount()); // আউটপুট: 1
এখানে count ভেরিয়েবল সরাসরি বাইরে থেকে অ্যাক্সেস করা যায় না, কিন্তু increment, decrement এবং getCount মেথড দিয়ে এর মান নিয়ন্ত্রণ করা হয়। এটা প্রাইভেট ডাটা এনক্যাপসুলেশনের উদাহরণ।
5. Closure-এর সমস্যা ও সতর্কতা
- Closure বেশি ব্যবহার করলে মেমোরি লিকের ঝুঁকি থাকতে পারে।
- অপ্রয়োজনীয় ভেরিয়েবল ধরে রাখতে পারে, যা পারফরম্যান্সে প্রভাব ফেলতে পারে।