ক্লোজার (Closure)
জাভাস্ক্রিপ্টের শক্তির একটি হলো ক্লোজার। জাভাস্ক্রিপ্ট নেস্টেড ফাংশন (ফাংশনের ভিতর ফাংশন) প্যারেন্ট ফাংশনের ভেরিয়েবল অ্যাক্সেস করতে দেয়। ইনার ফাংশন দ্বারা আউটার ফাংশনের ভেরিয়েবল অ্যাক্সেস করার এই প্রক্রিয়াকে ক্লোজার বলা হয়। মেমোরি লিক হয় যখন একটি ডিক্লেয়ারড ভেরিয়েবল অটোমেটিক্যালি ইনার নেস্টেড ফাংশনে উপলব্ধ থাকে এবং সেটি ইনার ফাংশনে রেফারেন্স না থাকলেও মেমোরিতে থাকে।
নিচের উদাহরণে 'childFunction' হলো 'parentFunction' অভ্যন্তরে ডিফাইন করা ইনার ফাংশন। যখন 'parentFunction'-এ প্যারামিটার "outer val" দিয়ে কল করা হয়, আউটার ভেরিয়েবল a-কে "outer val" মান অ্যাসাইন হয়। ফাংশনটি ইনার ফাংশন "childFunction"-এর পয়েন্টার রিটার্ন করে, যা 'val' ভেরিয়েবলে থাকে।
আউটার ফাংশনের লোকাল ভেরিয়েবল a আউটার ফাংশন রিটার্ন করলেও অস্তিত্বে থাকে। জাভাস্ক্রিপ্টে parentFunction কল হলে 'a' প্রপার্টি সহ একটি স্কোপ অবজেক্ট তৈরি হয়। এই প্রপার্টিতে arg1-এর মান থাকে, যাকে "outer val" বলা হয়। একইভাবে parentFunction রিটার্ন করলে ইনার ফাংশন (childFunction) রিটার্ন করে, যা val ভেরিয়েবলে থাকে।
যেহেতু ইনার ফাংশন আউটার ফাংশনের ভেরিয়েবলের রেফারেন্স ধরে রাখে, 'a' প্রপার্টি-বালা স্কোপ অবজেক্ট গারবেজ কালেক্ট হবে না।
উদাহরণ
<html> <body> <script> window.onload= function parentFunction(arg1) { var a = arg1; return function childFunction (arg2) { alert( a +" "+ arg2); }; }; var val = parentFunction("outer val"); val("inner val"); </script> </body> </html>
মেমোরি লিক এড়ানোর উপায়
একটি অতিরিক্ত ফাংশন যোগ করা
একটি অতিরিক্ত ফাংশন যোগ করলে দুটি ইনার ফাংশন হবে। যেহেতু দুটি ইনার ফাংশন আছে, কোনো ফাংশন আউটার ফাংশনের ভেরিয়েবল রেফার করতে পারবে না, ফলে ক্লোজার পুরোপুরি বন্ধ হয়ে যাবে।
ক্লোজার না থাকলে মেমোরি লিকের সম্ভাবনা কম থাকে।
উদাহরণ
<html> <body> <script> window.onload=function parentFunction(){ var Obj1 = function childFunction1() { document.write("the leak is avoided"); }; (function childFunction2(){ var obj2 = document.getElementById("closure"); obj2.onclick=Obj1 })(); }; </script> <input type = "button" id="closure" value ="Click Here"> </body> </html>
কোড এক্সিকিউট হলে নিচের মতো একটি বাটন দেখাবে

বাটন প্রেস করলে আউটপুট হবে নিচের মতো
আউটপুট
the leak is avoided