সংক্ষেপে জাভাস্ক্রিপ্ট বন্ধকরণ একটি ফাংশনকে একটি পরিবর্তনশীল অ্যাক্সেসের অনুমতি দেয় যা একটি লেজিক্যাল-প্যারেন্ট ফাংশনে ঘোষণা করা হয় ।
আসুন আরও বিস্তারিত ব্যাখ্যা দেখুন। ক্লোজারগুলি বুঝতে জাভাস্ক্রিপ্ট স্কোপগুলি কীভাবে ভেরিয়েবল হয় তা বোঝা গুরুত্বপূর্ণ।
সুযোগগুলি
জাভাস্ক্রিপ্টে স্কোপগুলি ফাংশন দিয়ে সংজ্ঞায়িত করা হয়। প্রতিটি ফাংশন একটি নতুন সুযোগকে সংজ্ঞায়িত করে।
নিম্নলিখিত উদাহরণ বিবেচনা করুন;
function f()
{//begin of scope f
var foo='hello'; //foo is declared in scope f
for(var i=0;i<2;i++){//i is declared in scope f
//the for loop is not a function, therefore we are still in scope f
var bar = 'Am I accessible?';//bar is declared in scope f
console.log(foo);
}
console.log(i);
console.log(bar);
}//end of scope f
কলিং এফ প্রিন্টস
hello
hello
2
Am I Accessible?
আসুন এখন বিবেচনা করা যাক আমরা g
অন্য ফাংশন মধ্যে সংজ্ঞায়িত একটি ফাংশন আছে f
।
function f()
{//begin of scope f
function g()
{//being of scope g
/*...*/
}//end of scope g
/*...*/
}//end of scope f
আমরা ডাকব আভিধানিক পিতা বা মাতা এর । যেমনটি এখন আমাদের 2 টি স্কোপ রয়েছে তার আগে ব্যাখ্যা করা হয়েছে; সুযোগ এবং সুযোগ ।f
g
f
g
তবে একটি সুযোগ অন্য ক্ষেত্রের মধ্যে "ভিতরে" তাই বাচ্চা ফাংশনটির সুযোগটি পিতামাতার ফাংশনের সুযোগের অংশ? প্যারেন্ট ফাংশনের সুযোগে ঘোষিত ভেরিয়েবলগুলির সাথে কী ঘটে; আমি কি শিশু ফাংশনের সুযোগ থেকে তাদের অ্যাক্সেস করতে সক্ষম হব? ঠিক সেখানেই ক্লোজারগুলি এগিয়ে যায়।
বন্ধ
জাভাস্ক্রিপ্টে ফাংশনটি g
স্কোপটিতে ঘোষিত কোনও ভেরিয়েবল অ্যাক্সেস করতে পারে না g
তবে প্যারেন্ট ফাংশনের সুযোগে ঘোষিত কোনও ভেরিয়েবল অ্যাক্সেস করতে পারে f
।
নিম্নলিখিত বিবেচনা করুন;
function f()//lexical parent function
{//begin of scope f
var foo='hello'; //foo declared in scope f
function g()
{//being of scope g
var bar='bla'; //bar declared in scope g
console.log(foo);
}//end of scope g
g();
console.log(bar);
}//end of scope f
কলিং এফ প্রিন্টস
hello
undefined
লাইনটি তাকান console.log(foo);
। এই মুহুর্তে আমরা সুযোগে রয়েছি g
এবং আমরা সুযোগ foo
হিসাবে ঘোষিত ভেরিয়েবলটি অ্যাক্সেস করার চেষ্টা করি f
। তবে যেমনটি বলা হয়েছে যে আমরা এখানে একটি লেজিক্যাল প্যারেন্ট ফাংশনে ঘোষিত কোনও পরিবর্তনশীল অ্যাক্সেস করতে পারি; g
এর লেজিক্যাল পিতা-মাতা f
। সুতরাং hello
মুদ্রিত হয়।
আসুন এখন লাইনটি দেখুন console.log(bar);
। এই মুহুর্তে আমরা সুযোগে রয়েছি f
এবং আমরা সুযোগ bar
হিসাবে ঘোষিত ভেরিয়েবলটি অ্যাক্সেস করার চেষ্টা করি g
। bar
বর্তমান সুযোগে ঘোষিত হয় না এবং ফাংশনটি g
এর পিতামাতার নয় f
, তাই bar
অপরিজ্ঞাত
আসলে আমরা একটি লেজিকাল "গ্র্যান্ড প্যারেন্ট" ফাংশনের সুযোগ হিসাবে ঘোষিত ভেরিয়েবলগুলিও অ্যাক্সেস করতে পারি। সুতরাং যদি ফাংশন h
মধ্যে নির্ধারিত একটি ফাংশন আছেg
function f()
{//begin of scope f
function g()
{//being of scope g
function h()
{//being of scope h
/*...*/
}//end of scope h
/*...*/
}//end of scope g
/*...*/
}//end of scope f
তারপর h
সব ভেরিয়েবল ফাংশনের সুযোগ ঘোষণা অ্যাক্সেস করতে সক্ষম হবে h
, g
এবং f
। এটি ক্লোজার দিয়ে করা হয় । জাভাস্ক্রিপ্টের ক্লোজারগুলিতে আমাদের লেক্সিকাল প্যারেন্ট ফাংশন, লেজিকাল গ্র্যান্ড প্যারেন্ট ফাংশন, লেক্সিকাল গ্র্যান্ড-গ্র্যান্ড প্যারেন্ট ফাংশন ইত্যাদিতে ঘোষিত যে কোনও চলক অ্যাক্সেসের অনুমতি দেয় ; এটিকে স্কোপ চেইন হিসাবে দেখা যায় ; scope of current function -> scope of lexical parent function -> scope of lexical grand parent function -> ...
কোনও লাসিক্যাল প্যারেন্ট নেই এমন শেষ প্যারেন্ট ফাংশন পর্যন্ত।
উইন্ডো অবজেক্ট
আসলে চেইনটি শেষ পিতামাতার কার্যক্রমে থামে না। আরও একটি বিশেষ সুযোগ আছে; বিশ্বব্যাপী সুযোগ । কোনও কার্যক্রমে ঘোষিত না হওয়া প্রতিটি পরিবর্তনশীলকে বিশ্বব্যাপী ঘোষিত হিসাবে ঘোষণা করা হয়। বৈশ্বিক ক্ষেত্রের দুটি বিশেষত্ব রয়েছে;
- গ্লোবাল স্কোপে ঘোষিত প্রতিটি পরিবর্তনশীল সর্বত্রই অ্যাক্সেসযোগ্য
- বৈশ্বিক স্কোপে ঘোষিত ভেরিয়েবলগুলি
window
বস্তুর বৈশিষ্ট্যের সাথে সামঞ্জস্য করে ।
সুতরাং foo
বৈশ্বিক পরিমণ্ডলে পরিবর্তনশীল ঘোষণার ঠিক দুটি উপায় রয়েছে ; হয় কোনও ফাংশনে এটি ঘোষণা না করে বা foo
উইন্ডো অবজেক্টের সম্পত্তি সেট করে ।
উভয় প্রচেষ্টা ক্লোজার ব্যবহার করে uses
এখন আপনি আরও বিস্তারিত ব্যাখ্যা পড়েছেন এটি এখন স্পষ্ট হতে পারে যে উভয় সমাধানই ক্লোজার ব্যবহার করে। তবে নিশ্চিত হওয়ার জন্য, আসুন একটি প্রমাণ দিন।
আসুন একটি নতুন প্রোগ্রামিং ভাষা তৈরি করি; জাভাস্ক্রিপ্ট-কোন-বন্ধ। নামটি যেমন বোঝায়, জাভাস্ক্রিপ্ট-নো-ক্লোজার জাভাস্ক্রিপ্টের সমান এটি বাদে এটি ক্লোজারগুলিকে সমর্থন করে না।
অন্য কথায়;
var foo = 'hello';
function f(){console.log(foo)};
f();
//JavaScript-No-Closure prints undefined
//JavaSript prints hello
ঠিক আছে, আসুন দেখুন জাভাস্ক্রিপ্ট-নো-ক্লোজারের সাথে প্রথম সমাধানের সাথে কী ঘটে;
for(var i = 0; i < 10; i++) {
(function(){
var i2 = i;
setTimeout(function(){
console.log(i2); //i2 is undefined in JavaScript-No-Closure
}, 1000)
})();
}
সুতরাং এটি undefined
জাভাস্ক্রিপ্ট-নো-ক্লোজারে 10 বার মুদ্রণ করবে ।
সুতরাং প্রথম সমাধানটি ক্লোজার ব্যবহার করে।
দ্বিতীয় সমাধানটি দেখি;
for(var i = 0; i < 10; i++) {
setTimeout((function(i2){
return function() {
console.log(i2); //i2 is undefined in JavaScript-No-Closure
}
})(i), 1000);
}
সুতরাং এটি undefined
জাভাস্ক্রিপ্ট-নো-ক্লোজারে 10 বার মুদ্রণ করবে ।
উভয় সমাধান ক্লোজার ব্যবহার করে।
সম্পাদনা করুন: ধারণা করা হয় যে এই 3 টি কোড স্নিপেটগুলি বিশ্বব্যাপী সুযোগে সংজ্ঞায়িত করা হয়নি। তা না হলে ভেরিয়েবল foo
এবং i
প্রদানকারীর সাথে যুক্ত হন হবে window
বস্তু এবং সেইজন্য মাধ্যমে অ্যাক্সেসযোগ্য window
উভয় জাভাস্ক্রিপ্ট এবং JavaScript-কোন-বন্ধ বস্তুর।