জাভাস্ক্রিপ্টের আলোচিত বিষয়গুলোর মাঝে একটি হল Scope। আপনি যদি একজন নতুন জাভাস্ক্রিপ্ট প্রোগ্রামার হয়ে থাকেন তাহলে এটির সাথে ভাল করে পরিচয় হওয়া অতি প্রয়োজন। তাই আজকে scope নিয়ে মনের কিছু কথা বলতে চাচ্ছি। 😛

Scope কি?

Scope মূলত একটা নির্দিষ্ট সীমানাকে বোঝায়। যার বাহিরে Variable এবং Function-গুলো এক্সেসিবল না। যদি এই সীমানার বাহিরে কোন Variable এবং Function কে কল করা হয় তাহলে তার কোন অস্তিত্ব থাকবে না। একটি কথা ভাল করে মাথায় সংরক্ষণ করে রাখেন যে, জাভাস্ক্রিপ্টে একমাত্র তখনই Scope তৈরি হয়, যখন আমরা কোন function ইনভোক বা কাল করি। হ্যাঁ, function ছাড়া আর কোথাও Scope তৈরি হয় না। আর এই Scope হচ্ছে দুই প্রকার- ১. Global Scope এবং ২. Local Scope

১. Global Scope

জাভাস্ক্রিপ্টে বাই ডিফল্ট সব কিছু Global Scope – এ রান হয়ে। যার এক্সেসিবল সব জায়গায় থাকে। উদাহরণস্বরূপ-

var globalVariable = "I am global variable.";
console.log(globalVariable); // I am global variable.

var myFunc = function() {
    console.log(globalVariable);
}

myFunc() // I am global variable.

উপরের কোডটুকু রান করলে দেখতে পারবেন যে globalVariable নামের ভেরিয়েবলটিকে সব যায়গায় ব্যবহার করা যাচ্ছে এবং সবার আউটপুটও একই দেখাচ্ছে।

২. Local Scope

আগেই বলেছিলাম যে, জাভাস্ক্রিপ্ট একমাত্র Scope তৈরি করে কোন Function ইনভোক বা কাল করলে। এই Scope কেই বলা হয় Local Scope। মানে হচ্ছে, তার ভিতরে যা কিছু থাকবে তার নিজস্ব Scope – এর বাহিরে এর কোন অস্তিত্ব থাকবে না। অর্থাৎ, তার Scope – এর ভিতরে লিখা কোন ভেরিয়েবলকে যদি আমরা বাহিরে অন্য কোথাও ব্যবহার করতে চাই তাহলে জাভাস্ক্রিপ্ট খুব সুন্দর করে একটি আনকট রেফারেন্সে ইরর দিয়ে বলে দিবে যে খোকা তুমি যাকে ব্যবহার করতে চাচ্ছ সে তো কোথাও ডেফাইন করা নেই। চলুন একটা উদাহরণ দিয়ে দেখা যাক-

var globalVariable = "I am global variable.";

var myFunc = function() {
    var localVariable = "I am local variable.";

    console.log(globalVariable);
    console.log(localVariable);
}

myFunc();
// I am global variable.
// I am local variable.

console.log(localVariable); // udefined

উপরের কোডটুকু রান করলে দেখতে পারবেন যে প্রথমে দেখাচ্ছে I am global variable. এবং I am local variable. তারপর অতি ভদ্রতার সাথে খুব সুন্দর করে বলে দিছে যে আনকট রেফারেন্সেঃ লোকাল ইজ নট ডিফাইন্ড।

Lexical Scoping কি?

এখন সবার মনে প্রশ্ন আসতে পারে যে, এই Lexical Scoping – টা আবার কি? একটু অপেক্ষা করেন মাথা গরম করার কোন দরকার নেই। আসলে জাভাস্ক্রিপ্টকে বলা হয় Lexical Scoping ল্যাঙ্গুয়েজ। আমরা ফাংশনের ভিতরে আমাদের প্রয়োজন অনুযায়ী একাধিক ফাংশন তৈরি করতে পারি এবং চাইল্ড ফাংশনগুলো তার প্যারেন্ট ফাংশনের সব ভেরিয়াবলস এবং আর্গুমেন্টেসের এক্সেস পায়। কিন্তু আউটার ফাংশনগুলো তার চাইল্ড ফাংশনের ভেরিয়াবলস এবং আর্গুমেন্টেসের কোন এক্সেস পায় না। এই যে চাইল্ড ফাংশনগুলো তার প্যারেন্ট ফাংশনের ভেরিয়াবলস এবং আর্গুমেন্টেসের এক্সেস পাচ্ছে এই এক্সেস পাওয়াকেই বল হয় Lexical Scoping

function outerFunc(a) {
     var outerFuncVariable = "Hi there, I am outer " + a;

     console.log(outerFuncVariable); // Hi there, I am inner function variable

     function innerFunc() {
         var innerFuncVariable = "Hi there, I am inner " + a;
         console.log(innerFuncVariable);
     }

     innerFunc(); // Hi there, I am inner function variable

     console.log(innerFuncVariable); // undefined
 }

 outerFunc("function variable");

নোটসঃ

  • জাভাস্ক্রিপ্টের গ্লোবাল স্কোপ এবং লোকা স্কোপ আছে।
  • যে কোন ফাংশনের বাইরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যরিয়েবলগুলো গ্লোবাল ভ্যারিয়েবল হয়ে যায়।
  • ফাংশনে ভিতরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যারিয়েবলগুলো সেই ফাংশনের লোকাল ভ্যারিয়েবল হয়।
  • যে কোন ফাংশনের ভেতরে ভ্যারিয়েবল কীওয়ার্ড ছাড়া ডিক্লেয়ারড ভ্যারিয়েবলগুলো স্বয়ংক্রিয়ভাবে গ্লোবাল ভ্যারিয়েবল হয়ে যায়।
  • গ্লোবাল ভ্যারিয়েবলগুলো প্রোগ্রামের যেকোন জায়গায় অ্যাক্সেস এবং পরিবর্তন করা যেতে পারে।
  • ফাংশন ডিক্লেয়ারেশনের বাইরে লোকাল ভ্যারিয়েবল সমূহ অ্যাক্সেস করা যাবে না।
  • গ্লোবাল ভ্যারিয়েবল এবং লোকাল ভ্যারিয়েবল একই নাম থাকতে পারে। কিন্তু একই নাম ব্যবহার না করায় ভাল।

আশা করি, এখন Scope কি এবং Lexical Scoping কি কিছুটা হলেও বুঝতে পারছেন। আজ এই পর্যন্তই পরবর্তীতে অন্য কোন টপিক নিয়ে আবার হাজির হবো ইনশাআল্লাহ্‌। ততক্ষণ পর্যন্ত সবাই ভাল থাকুন। আল্লাহ্‌ হাফেজ।