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

জেভাস্ক্রিপ্ট ভেসারা একটি本地গ্লোবাল作用域。

全局变量能够通过ক্লোজার实现局部(私有)。

全局变量

函数能够访问函数内部定义的所有变量,比如:

ইনস্ট্যান্স

function myFunction() {
    var a = 4;
    return a * a;
} 

আপনার হাতে পরীক্ষা করুন

但是函数也能访问函数外部定义的变量,比如:

ইনস্ট্যান্স

var a = 4;
function myFunction() {
    return a * a;
} 

আপনার হাতে পরীক্ষা করুন

শেষ উদাহরণে,a হলগ্লোবালপরিবর্তক。

পাতায়, গ্লোবাল পরিবর্তকগুলো উইন্ডো অবজেক্টের অংশ

গ্লোবাল পরিবর্তকগুলো পাতার (এবং উইন্ডোর) সকল স্ক্রিপ্ট দ্বারা ব্যবহার এবং পরিবর্তন করা যায় এবং পরিবর্তন করা যায়。

প্রথম উদাহরণে,a হলস্থানীয়পরিবর্তক。

স্থানীয় পরিবর্তকগুলো শুধুমাত্র তাদের সংজ্ঞায়িত ফাংশনের মধ্যেই ব্যবহার করা যেতে পারে। অন্য ফাংশন এবং স্ক্রিপ্টগুলোর জন্য তা দেখা যায় না。

একই নামের গ্লোবাল এবং স্থানীয় পরিবর্তকগুলো ভিন্ন পরিবর্তক। একটিকে পরিবর্তন করলে, অন্যটিকে পরিবর্তন করা হবে না。

অপরিবর্তনীয়দ্বারা শব্দ var

তৈরিকৃত পরিবর্তকগুলো সর্বদা গ্লোবাল হয়, যদিও তারা ফাংশনের মধ্যে তৈরি হয়েছে।

সংখ্যালঘুটির জীবনকাল

স্থানীয় পরিবর্তকগুলো কম সময় জীবিত থাকে। তারা ফাংশন বাউন্ড করার সময় তৈরি হয়, এবং ফাংশন সমাপ্ত হলে মুছে যায়。

একটি সংখ্যালঘুটির সমস্যা

আপনি একটি পরিবর্তক ব্যবহার করে সংখ্যালঘুটিকে গণনা করতে চান, এবং আপনি চান যে এই সংখ্যালঘুটি সব ফাংশনের জন্য ব্যবহার্য হোক:

আপনি গ্লোবাল পরিবর্তক এবং ফাংশনকে ব্যবহার করে সংখ্যালঘুটিকে বাড়াতে পারেন:

ইনস্ট্যান্স

// সংখ্যালঘুটিকে পুনরায় সংজ্ঞায়িত করা
var counter = 0;
// সংখ্যালঘুটিকে বাড়ানোর ফাংশন
function add() {
  counter += 1;
}
// থ্রিবার add()
add();
add();
add();
// এখন সংখ্যালঘুটি 3 হওয়া উচিত

আপনার হাতে পরীক্ষা করুন

এই সমাধানটিতে একটি সমস্যা আছে: পাতায় কোনও কোডই সংখ্যালঘুটিকে পরিবর্তন করতে পারে, যদিও তারা add() ফাংশনকে বাউন্ড করতে পারেন না。

add() ফাংশনের জন্য, সংখ্যালঘুটি স্থানীয় হওয়া উচিত, যাতে অন্যান্য কোড তাকে পরিবর্তন করতে পারেন না:

ইনস্ট্যান্স

// সংখ্যালঘুটিকে পুনরায় সংজ্ঞায়িত করা
var counter = 0;
// সংখ্যালঘুটিকে বাড়ানোর ফাংশন
function add() {
  var counter = 0; 
  counter += 1;
}
// থ্রিবার add()
add();
add();
add();
// এখন সংখ্যালঘুটি 3 হওয়া উচিত। কিন্তু তা 0 হয়েছে。

আপনার হাতে পরীক্ষা করুন

এটা কাজে আসবে না, কারণ আমরা গ্লোবাল সংখ্যালঘুটিকে প্রদর্শন করছি না, স্থানীয় সংখ্যালঘুটিকে প্রদর্শন করছি।

আমরা ফাংশনটিকে ফিরিয়ে দিলে, গ্লোবাল সংখ্যালঘুটিকে মুছে ফেলতে এবং স্থানীয় সংখ্যালঘুটিকে প্রত্যাহার করতে পারি:

ইনস্ট্যান্স

// সংখ্যালঘুটিকে বাড়ানোর ফাংশন
function add() {
  var counter = 0; 
  counter += 1;
  return counter;
}
// থ্রিবার add()
add();
add();
add();
// এখন সংখ্যালঘুটি 3 হওয়া উচিত। কিন্তু তা 1 হয়েছে。

আপনার হাতে পরীক্ষা করুন

এটা কাজে আসবে না, কারণ আমরা প্রত্যেকবার ফাংশনটি বাউন্ড করতেই স্থানীয় সংখ্যালঘুটিকে পুনরায় সংজ্ঞায়িত করি。

জাভাস্ক্রিপ্ট এই অভ্যন্তরীণ ফাংশনগুলো এই সমস্যাকে সমাধান করতে পারে。

জাভাস্ক্রিপ্ট এই সমূহ ফাংশন

সব ফাংশনই গ্লোবাল স্কোপকে প্রত্যাহার করার অধিকার রাখে。

প্রকৃতপক্ষে, জাভাস্ক্রিপ্টে, সব ফাংশনই তাদের 'উপর' স্কোপকে প্রত্যাহার করার অধিকার রাখে。

জাভাস্ক্রিপ্ট এই সমূহ ফাংশনকে সমর্থন করে। এই সমূহ ফাংশনগুলো তাদের উপরস্থ স্কোপকে প্রত্যাহার করতে পারে。

এই উদাহরণে, অভ্যন্তরীণ ফাংশন plus() পিতৃফাংশের এই পরিবর্তককে ব্যবহার করা যেতে পারে: counter সংখ্যালঘু পরিবর্তক:

ইনস্ট্যান্স

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();     
    return counter; 
}

আপনার হাতে পরীক্ষা করুন

এইভাবে কাউন্টার সমস্যা সমাধান করা যাবে, যদি আমরা বাইরে থেকে এসে কাউন্টারকে অ্যাক্সেস করতে পারি plus() ফাংশন

আমরা একবার চলার জন্যও চাই counter = 0 পদ্ধতি

আমরা ক্লোজার (closure) চাই।

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

স্বক্ষপত ফাংশন কলে মনে করেন? এই ফাং�ন কী করবে?

ইনস্ট্যান্স

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
add();
add();
add();
// কাউন্টার বর্তমানে ৩ 

আপনার হাতে পরীক্ষা করুন

উদাহরণ ব্যাখ্যা

বিন্যাস add এর অ্যাসাইনমেন্ট হলো স্বক্ষপত ফাংশনের রিটার্ন ভ্যালু。

এই স্বক্ষপত ফাংশন একবার শুধুমাত্র চলে।এটি কাউন্টারকে শুধুমাত্র ০ (০) করে সংযোজিত করে এবং ফাংশন এক্সপ্রেশন রিটার্ন করে。

এইচ্যার্ট হলো ফাংশন, যা পিতৃতল স্কোপপির কাউন্টারকে অ্যাক্সেস করতে পারে。

এইচ্যার্ট জেস ক্লোজার।এটি ফাংশনকে “প্রাইভেট”বিন্যাস হয়েছে।

কাউন্টার এই অনন্য ফাংশনের স্কোপপি দ্বারা সুরক্ষিত এবং কেবলমাত্র add ফাংশন দ্বারা সংশোধন করা যেতে পারে。

ক্লোজার বলা হয়, যা পিতৃতল এক্সিউমেন্টকে অ্যাক্সেস করতে পারে, যদিও পিতৃতল ফাংশন বন্ধ হয়েছে。