(ফাংশন তার বাইরের স্কোপ মনে রাখে — এমনকি বাইরের ফাংশনটি শেষ হয়ে যাওয়ার পরেও)
একটি ক্লোজার তৈরি হয় যখন একটি ফাংশন তার বাইরের (লেক্সিক্যাল) স্কোপের ভেরিয়েবল "মনে রাখে", এমনকি বাইরের ফাংশনটি রিটার্ন হয়ে যাওয়ার পরেও।
function outer() {
let name = "Alice";
function inner() {
console.log("Hello, " + name); // name আসে outer() থেকে
}
return inner;
}
const greet = outer(); // outer() রিটার্ন করে inner
greet(); // "Hello, Alice"যদিও outer() এক্সিকিউশন শেষ হয়ে গেছে, তবুও ক্লোজারের কারণে inner() এখনও name মনে রাখে।
ক্লোজার ব্যবহার করা হয়:
useState, useEffect-এর মতো React hook-এfunction secretHolder() {
let secret = "1234";
return {
getSecret: function () {
return secret;
},
setSecret: function (newSecret) {
secret = newSecret;
},
};
}
const vault = secretHolder();
console.log(vault.getSecret()); // "1234"
vault.setSecret("5678");
console.log(vault.getSecret()); // "5678"secret সরাসরি অ্যাক্সেস করা যায় না — শুধুমাত্র রিটার্ন করা মেথডগুলোর মাধ্যমে।
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// আউটপুট: 3 3 3 (0 1 2 নয়!)let দিয়ে সমাধান:
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}
// আউটপুট: 0 1 2 ✅ব্যাখ্যা: let প্রতিটি ইটারেশনে একটি নতুন ব্লক স্কোপ তৈরি করে, তাই ক্লোজারের কারণে প্রতিটি i সঠিকভাবে সংরক্ষিত থাকে।
function makeMultiplier(x) {
return function (y) {
return x * y;
};
}
const double = makeMultiplier(2);
console.log(double(5)); // 10
const triple = makeMultiplier(3);
console.log(triple(5)); // 15প্রতিটি রিটার্ন করা ফাংশন তার নিজস্ব x-এর মান "মনে রাখে"।
closure আপনাকে একটি ইনার ফাংশন থেকে বাইরের ফাংশনের ভেরিয়েবলে অ্যাক্সেস দেয়।স্টেট সংরক্ষণ করে এবং প্রাইভেট ভেরিয়েবল সক্ষম করে।counter() ফাংশন তৈরি করুন যা এমন একটি ফাংশন রিটার্ন করে, যা কাউন্ট বাড়ায় এবং লগ করে।greeting(name) ফাংশন তৈরি করুন যা আরেকটি ফাংশন রিটার্ন করে, যা "Hello, name" বলে।