কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্টে ক্লোজারের ব্যবহারিক ব্যবহার


একটি ক্লোজার হলো একটি ফাংশন এবং সেই লেক্সিক্যাল এনভায়রনমেন্টের কম্বিনেশন যেখানে সেই ফাংশন ডিক্লেয়ার করা হয়েছিল।

function outerFunc() { var name = "TutorialsPoint"; // name outerFunc-এ তৈরি একটি লোকাল ভেরিয়েবল return function innerFunc() { // innerFunc() ইনার ফাংশন, একটি ক্লোজার console.log(name); // পেরেন্ট ফাংশনে ডিক্লেয়ার করা ভেরিয়েবল ব্যবহার } } let f = outerFunc(); f()

outerFunc() একটি লোকাল ভেরিয়েবল name এবং একটি ফাংশন innerFunc() তৈরি করে। innerFunc() ফাংশন একটি ইনার ফাংশন যা outerFunc()-এর ভিতরে ডিফাইন করা হয়েছে এবং শুধু outerFunc()-এর বডিতে উপলব্ধ।

লক্ষ্য করুন যে innerFunc() ফাংশনের নিজস্ব কোনো লোকাল ভেরিয়েবল নেই। যাইহোক, যেহেতু ইনার ফাংশনগুলোর পেরেন্ট ফাংশনের ভেরিয়েবলগুলোর এক্সেস থাকে, innerFunc() পেরেন্ট ফাংশন outerFunc()-এ ডিক্লেয়ার করা name ভেরিয়েবল এক্সেস করতে পারে।

আপনি দেখতে পাচ্ছেন যে outerFunc এক্সিকিউশন কমপ্লিট হলে name স্কোপের বাইরে চলে গেল। কিন্তু আপনি যদি গোড়ায় দেখেন, innerFunc যা রিটার্ন হয়ে f-এ অ্যাসাইন করা হয়েছিল, সেটি এখনও name ভেরিয়েবলে এক্সেস রাখে। তাই inner func outerFunc-এর লেক্সিক্যাল স্কোপের ওপর একটি ক্লোজার ফর্ম করেছে।

ব্যবহারিক ব্যবহার

প্রাইভেট মেথড অনুকরণ − জাভাের মত ল্যাঙ্গুয়েজ প্রাইভেট মেথড ডিক্লেয়ার করার ক্ষমতা দেয়, অর্থাৎ সেগুলো শুধু একই ক্লাসের অন্যান্য মেথড দ্বারা কল করা যায়। জাভাস্ক্রিপ্টে এটি করার কোনো নেটিভ উপায় নেই, কিন্তু ক্লোজার ব্যবহার করে প্রাইভেট মেথড অনুকরণ করা যায়।

উদাহরণ

var counter = (() => { var privateCounter = 0; let changeBy = (val) => privateCounter += val; return { increment: () => changeBy(1), decrement: () => changeBy(-1), value: () => privateCounter }; })(); console.log(counter.value()); counter.increment(); counter.increment(); console.log(counter.value()); counter.decrement(); console.log(counter.value());

আউটপুট

0 2 1

ইভেন্ট হ্যান্ডলারের সাথে ব্যবহার

for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", alert(i)) }

আপনার buttons কালেকশনে ৪টি বাটন থাকলে এবং এইভাবে ইভেন্ট লিসেনার যোগ করলে, সেই বাটনগুলোর যেকোনো একটিতে ক্লিক করলে undefined রেজাল্ট দেবে। কারণ কল হলে i আর ডিফাইনড থাকবে না। এটির সমাধান হলো i-এর ওপর একটি ক্লোজার ইন্ট্রোডিউস করা।

for(let i = 0; i < 4; i++) { button = buttons[i] button.addEventListener("click", () => alert(i)) }

  1. জাভাস্ক্রিপ্ট Number() ফাংশন

  2. জাভাস্ক্রিপ্টে ক্লোジャー (Closures) কী?

  3. জাভাস্ক্রিপ্টে ফাংশন প্রোটোটাইপ

  4. জাভাস্ক্রিপ্টে ফাংশন বরোइং (Function Borrowing)