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 as undefined. 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, use let when reassignment is needed, and avoid var.
  • 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 — use Object.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.