var এর সাথে let এবং const এর পার্থক্য
var, let এবং const সবগুলোই জাভাস্ক্রিপ্টে ভ্যারিয়েবল ঘোষণা করার জন্য ব্যবহৃত হয়, তবে এই তিনটি কীওয়ার্ডের মধ্যে কিছু মৌলিক পার্থক্য রয়েছে। var কিওয়ার্ড ES5 এ ছিল, যেখানে let এবং const ES6 (ECMAScript 2015) এ প্রবর্তিত হয়। নিচে var, let, এবং const এর মধ্যে পার্থক্যগুলি বিস্তারিতভাবে আলোচনা করা হলো:
1. স্কোপ (Scope)
var:varকিওয়ার্ড গ্লোবাল স্কোপ বা ফাংশন স্কোপে ভ্যারিয়েবল ডিক্লেয়ার করে। এর মানে হলো,varদিয়ে ডিক্লেয়ার করা ভ্যারিয়েবল ফাংশনের বাইরে থেকেও অ্যাক্সেস করা যেতে পারে (গ্লোবাল স্কোপে) বা একে ফাংশনের মধ্যে সীমাবদ্ধ করা যায়।var name = "John"; // গ্লোবাল স্কোপে ভ্যারিয়েবল function greet() { var age = 30; // ফাংশন স্কোপে ভ্যারিয়েবল } console.log(name); // "John" (গ্লোবাল স্কোপে) console.log(age); // এরর (ফাংশন স্কোপে)letএবংconst:letএবংconstকেবলমাত্র ব্লক স্কোপড, অর্থাৎ এগুলি শুধুমাত্র সেই ব্লকের মধ্যে (যেমন if statement, loop) প্রযোজ্য যেখানে এগুলি ডিক্লেয়ার করা হয়। ব্লক স্কোপড ভ্যারিয়েবলগুলি ফাংশনের বাইরে অ্যাক্সেস করা যাবে না।if (true) { let name = "John"; const age = 30; } console.log(name); // এরর (ব্লক স্কোপে) console.log(age); // এরর (ব্লক স্কোপে)
2. হোইস্টিং (Hoisting)
var:varভ্যারিয়েবল হোইস্টিং হয়, তবে এটি undefined হিসেবে প্রাথমিকভাবে হোইস্ট হয়, মানে আপনি ভ্যারিয়েবলটি ডিক্লেয়ার হওয়ার আগে ব্যবহার করতে পারবেন, তবে তার মান undefined হবে।console.log(name); // undefined var name = "John"; console.log(name); // "John"letএবংconst:letএবংconstউভয়ই hoisting এর মাধ্যমে উঠলেও, এগুলির জন্য Temporal Dead Zone (TDZ) থাকে, যার মানে হল যে, এগুলির ব্যবহার ডিক্লেয়ার হওয়ার আগে করা যাবে না। যদি আপনি এগুলি ডিক্লেয়ার হওয়ার আগে ব্যবহার করেন, তাহলে ত্রুটি (error) হবে।console.log(name); // Error: Cannot access 'name' before initialization let name = "John";
3. মান পরিবর্তনযোগ্যতা (Reassignability)
var:varদ্বারা ডিক্লেয়ার করা ভ্যারিয়েবলটি পরিবর্তনযোগ্য (mutable), অর্থাৎ এর মান আপনি যে কোনো সময় পরিবর্তন করতে পারবেন।var name = "John"; name = "Doe"; // পরিবর্তন করা সম্ভব console.log(name); // "Doe"let:letদিয়ে ডিক্লেয়ার করা ভ্যারিয়েবলটি পরিবর্তনযোগ্য (mutable), এর মানও আপনি পরিবর্তন করতে পারবেন।let name = "John"; name = "Doe"; // পরিবর্তন করা সম্ভব console.log(name); // "Doe"const:constদিয়ে ডিক্লেয়ার করা ভ্যারিয়েবলটি অপরিবর্তনীয় (immutable), একবার মান সেট করার পর, আপনি এটি পরিবর্তন করতে পারবেন না।const name = "John"; name = "Doe"; // Error: Assignment to constant variable
4. ব্লক লেভেল স্কোপ (Block-Level Scope) vs ফাংশন লেভেল স্কোপ (Function-Level Scope)
var:varশুধুমাত্র ফাংশন লেভেল স্কোপে কাজ করে, অর্থাৎ এটি যদি ফাংশনের বাইরে ডিক্লেয়ার করা হয়, তবে এটি গ্লোবাল স্কোপে চলে আসে। কিন্তু, যদি এটি কোনো ফাংশনের মধ্যে ডিক্লেয়ার করা হয়, তবে শুধুমাত্র ঐ ফাংশনের মধ্যে প্রযোজ্য থাকে।if (true) { var name = "John"; // গ্লোবাল স্কোপে চলে আসে } console.log(name); // "John"letএবংconst:letএবংconstব্লক লেভেল স্কোপে থাকে। অর্থাৎ, এগুলি শুধুমাত্র সেই কোড ব্লকের মধ্যে প্রযোজ্য, যেখানে এগুলি ডিক্লেয়ার করা হয়েছে।if (true) { let name = "John"; // ব্লক স্কোপে } console.log(name); // Error: name is not defined
5. গ্লোবাল স্কোপে ভ্যারিয়েবল (Global Scope)
var:varকিওয়ার্ড গ্লোবাল স্কোপে ডিক্লেয়ার করা হলে, এটি window অবজেক্টের অংশ হয়ে যায় (যদি ব্রাউজারে কোড চলে)।var name = "John"; console.log(window.name); // "John"letএবংconst:letএবংconstগ্লোবাল স্কোপে ডিক্লেয়ার করা হলে, তারা window অবজেক্টের অংশ হয়ে যায় না, অর্থাৎ এগুলি গ্লোবাল স্কোপের অংশ হলেও window অবজেক্টে পৌঁছায় না।let name = "John"; console.log(window.name); // undefined
6. উপসংহার
var এবং let, const এর মধ্যে বেশ কিছু মৌলিক পার্থক্য রয়েছে:
varগ্লোবাল বা ফাংশন স্কোপড, তবেletএবংconstব্লক স্কোপড।varহোইস্টিং সাপোর্ট করে এবং তার মান undefined থাকে, যখনletএবংconstহোইস্টিং এর মাধ্যমে Temporal Dead Zone সৃষ্টি করে।varদ্বারা ডিক্লেয়ার করা ভ্যারিয়েবলটি যে কোনো সময় পরিবর্তনযোগ্য (mutable), তবেconstকনস্ট্যান্ট ভ্যারিয়েবল তৈরি করে যা পরিবর্তনযোগ্য নয়, আরletপরিবর্তনযোগ্য (mutable) ভ্যারিয়েবল তৈরি করে।
এগুলির সঠিক ব্যবহার আপনার কোডের নিরাপত্তা এবং কার্যকারিতা বাড়াতে সাহায্য করবে।
Read more