প্রেমিক কুদ্দুস এবং জাভাস্ক্রিপ্ট ক্লোজার এর গল্প...

Rakibul Hasan
3 min readJul 20, 2018

জনাব কুদ্দুস একজন বিশিষ্ট প্রেমিক এবং একজন ধজাভাঙ্গা (!) প্রোগ্রামার। তিনি ভালবাসেন প্রেম করতে, এবং ভালবাসেন প্রোগ্রামিং... প্রেম দিয়ে প্রোগ্রামিং এবং প্রোগ্রামিং দিয়ে প্রেম করা তার একটি অলৌকিক গুন!

একদা কুদ্দুস ভাই তার প্রেমিকাকে ফোন করার জন্য একটি প্রোগ্রাম লিখলেন...

প্রোগ্রামটি রান করে কুদ্দুস ভাইয়ের প্রেমিকার সাথে একটু আলাপ করে নিতে পারেন 😉

প্রোগ্রাম টি লিখতে গিয়ে কুদ্দুস ভাই জানতে পারলেন "ক্লোজার" (Closure) সম্পর্কে। এই হতচ্ছাড়া ক্লোজার আবার কি? 😒😒😒

ক্লোজার হচ্ছে, যখন কোন ফাংশন এর লেক্সিকাল স্কোপ এর বাইরে এক্সিকিউট হওয়া সত্ত্বেও ঐ লেক্সিকাল স্কোপ কে মনে রাখতে এবং ব্যবহার করতে পারে।

টাটা... বাইবাই। ভালো থাইকেন। কিছুই বুঝি নাই, হুদাই সময় নষ্ট করার মানে নাই!!!😑😑😑

আরে থামেন, বুঝাইতেছি... প্রেম আর প্রোগ্রামিং এই দুইটা করতে গেলে অবশ্যই ধৈর্য থাকতে হবে আর মাথা ঠাণ্ডা রাখতে হবে!! বাই দা ওয়ে! ইচ্ছা করেই আগে বলি নাই যে Closure বুঝতে হলে Scope, Lexical scope সম্পর্কেও একটু জানতে হবে। এই দেখ! নাম শুনেই ভয়ে ঘাম শুরু হয়ে গেছে 😅 প্রেম কিএতই সোজা?? 😉 চিন্তা নাই, স্কোপ, লেক্সিকাল স্কোপ তেমন কিছুই না! খালি শুনতেই ভয়ানক শোনায়। আমাদের কুদ্দুস ভাই যদি বুঝতে পারে তাইলে আপনিও বুঝবেন ৫ মিনিটেই ২০০% গ্যারান্টি 😁 এর জন্য আমাদের আরেকজন বিশিষ্ট বরেণ্য প্রেমিক জোনায়েদ ভাইয়ের এই লেখা টা টুপ করে পড়ে ফেলেনঃ

দারুণ! তো একটা ফাংশন যেই স্কোপ এ ডিফাইন করা হয়েছে, স্বাভাবিক ভাবেই সেটি ঐ স্কোপ এর যেকোনো ভেরিয়েবল নিয়ে টানাহিঁচড়া করতে পারবে, তাইনা? কুদ্দুস ভাইয়ের সেই প্রেমের প্রোগ্রামটিতে দেখুনঃ

এখনে কুদ্দুস ভাই callGf() ফাংশনের স্কোপে তার প্রেমিকার name দিয়েছেন। এর ভেতর calling() ফাংশন আবার সেই name ব্যবহার করছে তাকে ফোন করার জন্য!! এই calling() ফাংশন কেই Closure বলা যায়, কারণ সে তার স্কোপের বাইরের ভেরিয়েবল ব্যবহার করছে। কিন্তু সত্যি বলতে এখানে Closure এর আসল লম্পট চরিত্র ধরা পড়ে না! ঘটনা বুঝা মাত্রই কুদ্দুস ভাই তার প্রেমের প্রোগ্রামটি আপডেট করে ফেললেনঃ

এইবার Closure এর আসল চরিত্র সামনে আসলো! দেখুন ভিডিও সহ... 😜😜

খেয়াল করুন, আগের প্রোগ্রামে callGf() ফাংশনের ভেতর calling() ফাংশন ডিফাইন করেছিল এবং সেখানেই সেটি কল করেছিলো। অর্থাৎ calling() ফাংশন এর স্কোপ সম্পুর্ন callGf() ফাংশনের ভেতরেই ছিল। কিন্তু নতুন প্রোগ্রামে callGf() ফাংশনটি শুধু একটি ফাংশন রিটার্ন করছে। পরবর্তিতে আমরা calling ভেরিয়েবল এর মধ্যে callGf() ফাংশনটি কল করলাম, যাতে করে callGf() এর রিটার্ন করা ফাংশনটি calling এ স্টোর হল। তাহলে এখন হিসেবে calling ফাংশনটি কিন্তু callGf() ফাংশন এর বাইরে চলে এলো। তবুও এটি callGf() এর ভেতরে থাকা name ভেরিয়েবল টি এক্সেস করতে পারছে। এটাই হচ্ছে লম্পট Closure এর আসল চরিত্র! সে বাইরে থেকেও পরের ঘরের বৌ কে দেখতে পারে 😜

আশা করি ভালভাবে ক্লোজার এর চরিত্র বুঝাতে পারলাম! একটু সাবধানে থাকবেন কিন্তু 😉

ওহ! এদিকে আমার প্রেমিকার ডাক এসে গেছে! দেরি হলেই সর্বনাষ!! আজ গেলাম, আগামীকাল কুদ্দুস ভাইয়ের আরেকটি প্রেমের প্রোগ্রাম নিয়ে আসবো 😃

কুদ্দুস ভাইয়ের লাভ স্টোরি ভাল লাগলে লাইক শেয়ার ও কমেন্ট করে সাথে থাকবেন ❤️

--

--

Rakibul Hasan

Meteor.js — Angular.js — React.js — Node.js — Wordpress