let · var · const
let
— block‑scoped, reassignable, no redeclaration in the same scope.const
— block‑scoped, not reassignable; object contents can still change.var
— function‑scoped (or global), redeclarable, hoisted asundefined
. Avoid in modern code.
Syntax
let count = 0;
const PI = 3.1416;
var legacy = "old";
Examples
// ১) ব্লক স্কোপ বনাম ফাংশন স্কোপ
function উদাহরণ() {
যদি (true) {
ধরি এক = "A";
ধ্রুবক দুই = "B";
চলক তিন = "C";
}
// কনসোল.লগ(এক, দুই); // ReferenceError (ব্লক‑স্কোপ)
কনসোল.লগ(তিন); // "C" (var ফাংশন‑স্কোপড)
}
উদাহরণ();
// ২) পুনঃঘোষণা ও পুনঃনিয়োগ
ধরি x = 1;
x = 2; // OK
// ধরি x = 3; // Error: একই স্কোপে পুনঃঘোষণা নয়
ধ্রুবক cfg = { নাম: "Bnlang" };
// cfg = {}; // Error: const পুনঃনিয়োগ নয়
cfg.নাম = "BPM"; // OK: অবজেক্টের ভেতর বদলানো যায়
চলক y = 10;
চলক y = 20; // OK (redeclare)
// ৩) hoisting/TDZ
// কনসোল.লগ(a); // ReferenceError (TDZ)
ধরি a = 5;
// কনসোল.লগ(b); // ReferenceError (TDZ)
ধ্রুবক b = 6;
কনসোল.লগ(c); // undefined (var hoisted)
চলক c = 7;
// ৪) লুপে ক্লোজার—let ঠিক মান রাখে
for (ধরি i = 0; i < 3; i++) {
setTimeout(() => কনসোল.লগ("let i:", i), 0);
}
// var হলে 3,3,3 দেখাতে পারে
for (চলক j = 0; j < 3; j++) {
setTimeout(() => কনসোল.লগ("var j:", j), 0);
}
Notes
- Prefer
const
by default, uselet
when reassignment is needed, and avoidvar
. let
/const
are subject to the Temporal Dead Zone (TDZ) from the start of the scope until their declaration line executes.const
prevents rebinding; it does not make objects immutable — useObject.freeze
for shallow immutability.- Shadowing is allowed in nested blocks, but keep variable naming clear to avoid confusion.
- Keep one language style (English/Bangla/Banglish) per file for readability.