JavaScript Closures বাইরে থেকে ভেতরের গল্প!

বন্ধুরা, আজকে আমরা সেই ভয়ঙ্কর আর রোমাঞ্চকর গল্পের দিকে যাচ্ছি যেটা হচ্ছে JavaScript Closures। নাম শুনে ভড়কে গেলেন? চিন্তা নেই, আমি আছি না! এই "ক্লোজারস" এর রহস্যময় দুনিয়ায় আপনাদের জন্য থাকছে ঝংকারি গল্প, যা পড়ে Closures নিয়ে কোনো দুঃস্বপ্ন হবে না!

আরিফ আলমাছ

আরিফ আলমাছ

ওয়েব ডেভেলপার

📅৩১ আগস্ট, ২০২৪

🕵️ Closures কী জিনিস?

Closures হল এমন এক জাদু, যা জাভাস্ক্রিপ্টে ফাংশন লেখার সময় ঘটে। Closures বলতে আসলে এমন একটা ফাংশনকে বোঝায়, যেটি তার চারপাশের (parent) ফাংশনের স্কোপ থেকে ভেরিয়েবল "মনে রাখে" এমনকি parent ফাংশন কাজ শেষ করে চলে যাওয়ার পরেও। ভাবুন তো, পুরনো দিনের কোন গল্পের সেই রহস্যময় দরজা যেটা খুলে গেলে আপনি অদ্ভুত সব জিনিসপত্র দেখতে পান!

🎩 ক্লোজারসের ম্যাজিক কেমন?

ধরুন, আপনি এক লুকানো গুপ্তধনের সন্ধানে বেরিয়েছেন। তবে গুপ্তধন পেতে হলে দরজা খোলার গোপন কোড জানতে হবে। আর সেই কোডটা শুধু এক জায়গায় পাওয়া যায়, যেটা একবার বাইরে এলে আর ফিরে পাওয়া যায় না!

একটু কোডের মাধ্যমে দেখাই, ব্যাপারটা আরেকটু পরিষ্কার হবে:

function treasureBox() {
  let secretCode = 42; // গুপ্তধনের গোপন কোড
  
  function revealCode() {
    console.log("গোপন কোডটি হলো: " + secretCode);
  }
 
  return revealCode;
}
 
const mySecret = treasureBox(); // গুপ্তধনের বক্স খুললাম
mySecret(); // Output: "গোপন কোডটি হলো: 42"

এখানে কি হলো? treasureBox ফাংশন তার ভিতরে revealCode নামক আরেকটি ফাংশন তৈরি করেছে। treasureBox ফাংশন কাজ শেষ করার পরেও revealCode কিন্তু তার parent scope এর secretCode মনে রেখেছে! আরে বাবা, একেই তো বলে Closure!

🚪 Closures কিভাবে কাজ করে?

একটা Closure তৈরি হয় যখন কোনো ফাংশন তার parent scope এর ভেরিয়েবলগুলি ধরে রাখে। ভাবুন তো, আপনার হাতে এক ম্যাজিক ব্যাগ আছে যেখানে আপনি যেকোনো কিছু রাখতে পারেন এবং যখন দরকার হয় তখন বের করতে পারেন! ক্লোজারও সেরকমই, যে parent ফাংশনের সব প্রয়োজনীয় জিনিস "মনে রাখতে" পারে।

function counter() {
  let count = 0; // কাউন্টার ভেরিয়েবল
  
  return function() {
    count++; // গুনতি বাড়ানো
    console.log("বর্তমান গুনতি: " + count);
  };
}
 
const myCounter = counter();
myCounter(); // Output: "বর্তমান গুনতি: 1"
myCounter(); // Output: "বর্তমান গুনতি: 2"

এখানে, myCounter প্রতিবার count ভেরিয়েবলটি বাড়াচ্ছে এবং সেটা parent scope থেকে স্মরণ করে! একেই বলে "একেই তো Closure!" যে তার parent ফাংশনের scope ধরে রেখেছে এবং ব্যবহার করছে।

📦 Closures কেন এত মজার?

Closures এত মজার কারণ এর মাধ্যমে আমরা অনেক কাজ সহজে করতে পারি, যেমন:

  1. ডেটা প্রাইভেসি নিশ্চিত করা: Closures এর মাধ্যমে আমরা ডেটাকে ফাংশনের বাইরে থেকে "গোপন" রাখতে পারি। বাইরে থেকে কেউ আপনার "গুপ্তধনের কোড" দেখতে পাবে না!
  2. মেমোয়াইজেশন: কিছু বিশেষ কাজে আগের রেজাল্ট মনে রাখা দরকার হয়। ক্লোজার দিয়ে আমরা পুরনো রেজাল্ট মনে রেখে নতুন রেজাল্টের সাথে তুলনা করতে পারি। যেমন ধরুন, পাসওয়ার্ড ম্যানেজার যেভাবে পুরনো পাসওয়ার্ড মনে রাখে।
  3. কার্যকরী প্রোগ্রামিং: অনেক সময় ফাংশনকে অন্য ফাংশনের ভেতর দিয়ে ফাংশনাল প্রোগ্রামিং করতে হয়। সেক্ষেত্রে Closures আমাদের বেশ সাহায্য করে!

🎉 উপসংহার: জাভাস্ক্রিপ্টের Closures এর কাহিনী!

Closures শিখতে প্রথমে একটু জটিল মনে হতে পারে, কিন্তু একবার এর মজা পেয়ে গেলে, মনে হবে গুপ্তধনের সন্ধান পেয়েছেন! Closures এর শক্তি দিয়ে আপনি জাভাস্ক্রিপ্টের অনেক খুঁটিনাটি কাজ সহজেই করতে পারবেন।

যখনই কেউ বলবে "Closures জটিল!", তখন আপনি মুচকি হেসে বলবেন, "ধুর! গুপ্তধনের খোঁজ পেলে আর জটিল লাগে নাকি!"

এবার হাতে এক কাপ চা নিয়ে বসুন, কিছু কোড লিখুন, আর মজা করে শিখতে থাকুন JavaScript Closures!