ECMAScript স্পেসিফিকেশন অনুযায়ী
একটি var স্টেটমেন্ট রানিং এক্সিকিউশন কনটেক্সটের VariableEnvironment-এ স্কোপড ভেরিয়েবল ডিক্লেয়ার করে।
Var ভেরিয়েবলগুলো তাদের সংরক্ষক লেক্সিক্যাল এনভায়রনমেন্ট ইনস্ট্যানশিয়েট হওয়ার সাথে সাথে তৈরি হয়
এবং তৈরি হওয়ার সাথে সাথে undefined-এ ইনিশিয়ালাইজ হয়। [...]
একটি Initializer সহ VariableDeclaration দ্বারা সংজ্ঞায়িত একটি ভেরিয়েবল, তার Initializer-এর
AssignmentExpression-এর মান দিয়ে অ্যাসাইন হয় যখন VariableDeclaration এক্সিকিউট হয়,
না যে যখন ভেরিয়েবল তৈরি হয়।
মূল পার্থক্য
- সকল ভেরিয়েবল
undefined মান দিয়ে ইনিশিয়ালাইজ হয়।
- ভেরিয়েবল ডিক্লেয়ারেশন তাদের লেক্সিক্যাল এনভায়রনমেন্ট ইনিশিয়ালাইজেশনের সাথে সাথে
undefined-এ ইনিশিয়ালাইজ হয়।
- এই ইনিশিয়ালাইজেশন অ্যাসাইনমেন্টের মত কাজ করে না।
দৃশ্যমান উদাহরণ
console.log(x); // undefined (এরর নয়)
var x = 5;
console.log(y); // ReferenceError (TDZ)
let y = 10;
// ডিক্লেয়ারেশন vs ইনিশিয়ালাইজেশন
var a; // ডিক্লেয়ারেশন + ইনিশিয়ালাইজেশন (undefined)
var b = 10; // ডিক্লেয়ারেশন + ইনিশিয়ালাইজেশন (10)
b = 20; // শুধু অ্যাসাইনমেন্ট
হোইস্টিং প্রেক্ষাপটে
// এটি কীভাবে ইন্টারপ্রেট হয়:
var a;
console.log(a); // undefined
a = 5; // অ্যাসাইনমেন্ট (হোইস্ট হয় না)