2.6 জাভাস্ক্রিপ্টে স্কোপ
Scope কি?
Scope মূলত একটা নির্দিষ্ট সীমানাকে বোঝায়। যার বাহিরে Variable এবং Function-গুলো এক্সেসিবল না। যদি এই সীমানার বাহিরে কোন Variable এবং Function কে কল করা হয় তাহলে তার কোন অস্তিত্ব থাকবে না। একটি কথা ভাল করে মাথায় সংরক্ষণ করে রাখেন যে, জাভাস্ক্রিপ্টে একমাত্র তখনই Scope তৈরি হয়, যখন আমরা কোন function ইনভোক বা কল করি। হ্যাঁ, function ছাড়া আর কোথাও Scope তৈরি হয় না। আর এই Scope হচ্ছে দুই প্রকার-
- Global Scope
- Local Scope
১. Global Scope
জাভাস্ক্রিপ্টে বাই ডিফল্ট সব কিছু Global Scope – এ রান হয়। যার এক্সেস সব জায়গায় থাকে। উদাহরণস্বরূপ-
উপরের কোডটুকু রান করলে দেখতে পারবেন যে globalVariable নামের ভেরিয়েবলটিকে সব যায়গায় ব্যবহার করা যাচ্ছে এবং সবার আউটপুটও একই দেখাচ্ছে।
২. Local Scope
আগেই বলেছিলাম যে, জাভাস্ক্রিপ্ট একমাত্র তখনই Scope তৈরি করে যখন কোন Function কে ইনভোক বা কল করা হয়। এই Scope কেই বলা হয় Local Scope। মানে হচ্ছে, তার ভিতরে যা কিছু থাকবে তার নিজস্ব Scope – এর বাহিরে এর কোন অস্তিত্ব থাকবে না। অর্থাৎ, তার Scope – এর ভিতরে লেখা কোন ভেরিয়েবলকে যদি আমরা বাহিরে অন্য কোথাও ব্যবহার করতে চাই তাহলে জাভাস্ক্রিপ্ট খুব সুন্দর করে একটি আনকট রেফারেন্সে ইরর দিয়ে বলে দিবে যে খোকা তুমি যাকে ব্যবহার করতে চাচ্ছ সে তো কোথাও ডিফাইন করা নেই। চলুন একটা উদাহরণ দিয়ে দেখা যাক-
উপরের কোডটুকু রান করলে দেখতে পারবেন যে প্রথমে দেখাচ্ছে I am global variable. এবং I am local variable. তারপর অতি ভদ্রতার সাথে খুব সুন্দর করে এরর দিয়ে বলে দিচ্ছে যে Uncaught ReferenceError: localVariable is not defined।
Lexical Scoping কি?
এখন সবার মনে প্রশ্ন আসতে পারে যে, এই Lexical Scoping – টা আবার কি? একটু অপেক্ষা করেন মাথা গরম করার কোন দরকার নেই। আসলে জাভাস্ক্রিপ্টকে বলা হয় Lexical Scoping ল্যাঙ্গুয়েজ। আমরা ফাংশনের ভিতরে আমাদের প্রয়োজন অনুযায়ী একাধিক ফাংশন তৈরি করতে পারি এবং চাইল্ড ফাংশনগুলো তার প্যারেন্ট ফাংশনের সব ভেরিয়েবলস এবং আর্গুমেন্টেসের এক্সেস পায়। কিন্তু আউটার ফাংশনগুলো তার চাইল্ড ফাংশনের ভেরিয়াবলস এবং আর্গুমেন্টসের কোন এক্সেস পায় না। এই যে চাইল্ড ফাংশনগুলো তার প্যারেন্ট ফাংশনের ভেরিয়েবলস এবং আর্গুমেন্টেসের এক্সেস পাচ্ছে এই এক্সেস পাওয়াকেই বল হয় Lexical Scoping।
নোটসঃ
- জাভাস্ক্রিপ্টের গ্লোবাল স্কোপ এবং লোকাল স্কোপ আছে।
- যে কোন ফাংশনের বাইরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যারিয়েবলগুলো গ্লোবাল ভ্যারিয়েবল হয়ে যায়।
- ফাংশনের ভিতরে ডিক্লেয়ারড এবং ইনিশিয়ালাইজড ভ্যারিয়েবলগুলো সেই ফাংশনের লোকাল ভ্যারিয়েবল হয়।
- গ্লোবাল ভ্যারিয়েবলগুলো প্রোগ্রামের যেকোন জায়গায় অ্যাক্সেস এবং পরিবর্তন করা যেতে পারে।
- ফাংশন ডিক্লেয়ারেশনের বাইরে লোকাল ভ্যারিয়েবল সমূহ অ্যাক্সেস করা যাবে না।
- গ্লোবাল ভ্যারিয়েবল এবং লোকাল ভ্যারিয়েবল একই নাম থাকতে পারে। কিন্তু একই নাম ব্যবহার না করায় ভালো।
- global scope পরিবর্তন দেখুন
var x=23;function myFunc(){x=20console.log(x)}myFunc()console.log(x)
- নীচের উদাহরণটি বোঝার চেষ্টা করুন
function myFunc(){var y=20console.log(y)}myFunc()console.log(y)
- নীচের উদাহরণটি বোঝার চেষ্টা করুন
let animal=‘dog’;console.log(animal);if(true){let animal = ‘cat’;console.log(animal);}console.log(animal);
- নীচের উদাহরণটি বোঝার চেষ্টা করুন
var a=10function check(){console.log(a+y)}check()var y=5
- নীচের উদাহরণটি বোঝার চেষ্টা করুন
function scope(){if(true){var a=‘This is funtional scope’let b=“this is block scope”}console.log(a)console.log(b)}scope()output:This is functional scopeReferenceError: b is not defined
- কেন x এর value এইখানে unchanged global scope এ
- কেন এমন আউটপুট দেখাছে
- কোড চালানোর আগে চিন্তা করুন আউটপুট কি হবে এবং তারপর রান করুন এবং বলুন কেন এটি এই আউটপুট দেখাচ্ছে
- কোড চালানোর আগে চিন্তা করুন আউটপুট কি হবে এবং তারপর রান করুন এবং বলুন কেন এটি এই আউটপুট দেখাচ্ছে
- কোড চালানোর আগে চিন্তা করুন আউটপুট কি হবে এবং তারপর রান করুন এবং বলুন কেন এটি এই আউটপুট দেখাচ্ছে