ফাংশনের লেক্সিকাল এনভায়রনমেন্টের প্রয়োগ JavaScript-এ

ধরুন আমাদের একটি ফাংশন আছে, যার ফলাফল হিসেবে অন্য একটি ফাংশন ফেরত আসে:

javascriptfunction test() {
  return function() {
    
  }
}

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

javascriptfunction test() {
  let num = 1; // প্যারেন্ট ফাংশনের ভেরিয়েবল
  
  return function() {
    // লেক্সিকাল এনভায়রনমেন্ট = {num: 1}
  }
}

আমাদের রিটার্ন করা ফাংশনের কোডে console.log লিখি, যা num ভেরিয়েবলের মান প্রিন্ট করে:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

এখন প্যারেন্ট ফাংশন test কে কল করি এবং এর কাজের ফলাফল func ভেরিয়েবলে রাখি:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();

func ভেরিয়েবলে রিটার্ন করা ফাংশন লিখা হবে। আমাদের ফাংশনটি কল করি - এর ফলাফল হিসেবে num ভেরিয়েবলের কন্টেন্ট প্রিন্ট হবে:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

let func = test();
func(); // 1 প্রিন্ট করবে

আর যদি ফাংশনের বাইরে num ভেরিয়েবল প্রিন্ট করার চেষ্টা করা হয় - এটি অ্যাক্সেস করা যাবে না:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    console.log(num);
  }
}

console.log(num); // num ভেরিয়েবল এখানে অ্যাক্সেস করা যায় না

আপনি দেখতে পাচ্ছেন, লোকাল ভেরিয়েবল num আমাদের ফাংশনের লেক্সিকাল এনভায়রনমেন্টের সাথে বাঁধা পড়েছে এবং এখন, কোডের যেকোনো জায়গায় এই ফাংশনটি কল করে, আমরা num ভেরিয়েবলের মান পেতে পারি, এমনকি যদি কল করার জায়গায় এই ভেরিয়েবলটি একা অ্যাক্সেস করা না যায়।

আসলে একই ফলাফল পাওয়া যেতে পারে num ভেরিয়েবলকে গ্লোবাল করে:

javascriptfunction test() {
  return function() {
    console.log(num);
  }
}

let num = 1; // গ্লোবাল ভেরিয়েবল
let func = test();
func(); // 1 প্রিন্ট করবে

যাইহোক, এখানে একটি গুরুত্বপূর্ণ পার্থক্য থাকবে: নতুন ভার্সনে num ভেরিয়েবল ফাংশনের বাইরে পরিবর্তন করা যেতে পারে (যেহেতু এটি গ্লোবাল), আর পুরানো ভার্সনে - যাবে না।

Задание 1

কোড রান না করেই নির্ধারণ করুন, কনসোলে কী প্রিন্ট হবে:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

let func = test();
console.log(func());
Задание 2

কোড রান না করেই নির্ধারণ করুন, কনসোলে কী প্রিন্ট হবে:

javascriptfunction test() {
  let num1 = 1;
  let num2 = 2;
  
  return function() {
    return num1 + num2;
  }
}

console.log(test()());
Задание 3

কোড রান না করেই নির্ধারণ করুন, কনসোলে কী প্রিন্ট হবে:

javascriptfunction test() {
  let num1 = 1;
  
  return function() {
    return num1 + num2;
  }
}

let num2 = 2;
let func = test();
console.log(func());
Задание 4

কোড রান না করেই নির্ধারণ করুন, কনসোলে কী প্রিন্ট হবে:

javascriptfunction test() {
  let num = 1;
  
  return function() {
    return num;
  }
}

let num = 2;
let func = test();
console.log(func());