JavaScript-এ Scope কীভাবে কাজ করে এবং গ্লোবাল স্কোপ, লোকাল স্কোপ, এবং লেক্সিক্যাল স্কোপের পার্থক্য শিখুন।
Scope বোঝায় যে কন্টেক্সটে ফাংশন বা ভেরিয়েবল অ্যাক্সেসযোগ্য। JavaScript-এ তিন ধরনের স্কোপ আছে: গ্লোবাল স্কোপ, লোকাল স্কোপ, লেক্সিক্যাল স্কোপ:
- একটি গ্লোবাল ভেরিয়েবল হলো একটি ভেরিয়েবল যা কোড ব্লকের বাইরে ডিক্লেয়ার করা হয়েছে
- একটি লোকাল ভেরিয়েবল হলো একটি ভেরিয়েবল যা কোড ব্লকের ভিতরে ডিক্লেয়ার করা হয়েছে
জানা দরকার: ফাংশনগুলো ভেরিয়েবল এবং অন্যান্য ফাংশন অ্যাক্সেস করতে পারে যেগুলো তাদের বাইরে সেট করা আছে — কিন্তু তাদের ভিতরে সেট করা ভেরিয়েবল অ্যাক্সেস করতে পারে না।
এটা এক মিনিটে বোঝা যাবে।
গ্লোবাল স্কোপ
গ্লোবাল স্কোপে যেকোনো ভেরিয়েবল বা ফাংশন অন্যান্য ফাংশনের ভিতর থেকে অ্যাক্সেসযোগ্য:
// গ্লোবাল স্কোপ let dogBreed = "Labrador" let getDogBreed = function() { // dogBreed অ্যাক্সেসযোগ্য কারণ এটি গ্লোবাল স্কোপে আছে console.log(dogBreed) // "Labrador" } // ফাংশন রান করুন getDogBreed() এতে ফাংশন ভিতর ফাংশন-ও অন্তর্ভুক্ত:
// গ্লোবাল স্কোপ let dogBreed = "Labrador" let getDogBreed = function() { // ফাংশন ভিতর ফাংশন let getDogBreedFromGlobalScope = function() { // গ্লোবাল স্কোপ থেকে dogBreed অ্যাক্সেস করে console.log(dogBreed) // "Labrador" } // ফাংশন রান করুন getDogBreedFromGlobalScope() } // ফাংশন রান করুন getDogBreed() লোকাল স্কোপ
একটি লোকাল স্কোপের ভেরিয়েবল বা ফাংশন শুধু তার নিজস্ব কন্টেক্সট (স্কোপ) থেকে অ্যাক্সেসযোগ্য:
let getDogBreed = function() { // লোকাল ভেরিয়েবল স্কোপ let dogBreed = "Labrador" // আমরা dogBreed ভেরিয়েবল অ্যাক্সেস করতে পারি কারণ এটি লোকাল console.log(dogBreed) // "Labrador } ভেরিয়েবল dogBreed-এর লোকাল স্কোপ আছে, এবং এটি শুধু তার স্কোপের ভিতর থেকে (কার্লি ব্রেস { .. } এর ভিতর) অ্যাক্সেস করা যায়।
এখানে উপরের কোডটি একই, কিন্তু এইবার console.log(dogBreed) লোকাল স্কোপের বাইরে সরিয়ে দিয়েছি, এখন এটি গ্লোবাল স্কোপে আছে:
let getDogBreed = function() { // লোকাল ভেরিয়েবল স্কোপ let dogBreed = "Labrador" } // লোকাল স্কোপড ভেরিয়েবল অ্যাক্সেস করার চেষ্টা console.log(dogBreed) // Uncaught ReferenceError: dogBreed is not defined আপনি একটি রেফারেন্স এরর পাবেন, যা বলে "dog breed is not defined", কারণ আপনি গ্লোবাল স্কোপ থেকে একটি লোকালি স্কোপড ভেরিয়েবল লগ আউট করার চেষ্টা করছেন।
লেক্সিক্যাল স্কোপ
যখন আপনি নেস্ট করেন ফাংশনগুলো (ফাংশন ভিতর ফাংশন রাখেন), পেরেন্ট ফাংশন (বাহিরের ফাংশন) এর ভেরিয়েবল এবং ফাংশনগুলো ইনার ফাংশনগুলো থেকে অ্যাক্সেস করা যায়। এটিকে লেক্সিক্যাল স্কোপ বলা হয়।
তবে, পেরেন্ট (বাহিরের) ফাংশন নিজে, ইনার ফাংশনগুলোর ভেরিয়েবল বা ফাংশন অ্যাক্সেস করতে পারে না। এটা শুনতে বেশি কনফিউজিং লাগতে পারে, উদাহরণ দেখলে বুঝতে পারবেন:
// গ্লোবাল স্কোপ let animals = function() { // লেক্সিক্যাল স্কোপ let dogBreed = "Labrador" // নেস্টেড ফাংশন let getAnimals = function() { // dogBreed অ্যাক্সেস করতে পারি কারণ এটি লেক্সিক্যাল স্কোপে আছে console.log(dogBreed) // "Labrador" // এখানে একটি লোকালি স্কোপড ভেরিয়েবল let catBreed = "Persian" console.log(catBreed) // "Persian" } // ফাংশন রান করুন getAnimals() // এটি কাজ করে কারণ dogBreed ভেরিয়েবল লেক্সিক্যাল স্কোপে আছে console.log(dogBreed) // "Labrador" // এটি কাজ করবে না, কারণ catBreed লেক্সিক্যাল স্কোপে নয়, এটি getAnimals() ফাংশনের লোকাল console.log(catBreed) // Uncaught ReferenceError: catBreed is not defined } animals()