Skip to content

🗡️ Mastering var, let, and const with the Demon Slayer Corps 🐗

Welcome, valiant warrior! Join the Demon Slayer Corps on an enlightening journey to master the intricacies of JavaScript's var, let, and const. Together with Tanjiro, Nezuko, Zenitsu, and Inosuke, we'll explore how these declarations differ in reassignment, redeclaration, scope, hoisting, and the mysterious Temporal Dead Zone (TDZ). Along the way, we'll uncover the secrets of undefined vs. not defined.

The Call to Adventure

In the battle against demons, our heroes often need to manage resources, strategies, and abilities. They must declare variables that are accessible at the right time and place, ensuring their code is both efficient and error-free.

But how can they choose the right type of variable declaration for each situation?

Chapter 1: The Basics of var, let, and const

var—The Traditional Sword

Tanjiro recalls the traditional ways of declaring variables using var:

javascript
var sword = "Nichirin Blade";

But what are the characteristics of var?

  • Function-scoped: Accessible within the function it is declared.
  • Hoisted: Declarations are moved to the top of their scope during compilation.
  • Redeclarable: Can be redeclared within the same scope.
  • Reassignable: Can be assigned a new value.

let—The Adaptable Technique

Zenitsu prefers the modern let for its block-scoped nature:

javascript
let thunderBreath = "First Form";

Characteristics of let:

  • Block-scoped: Accessible within the block {} it is declared.
  • Not hoisted in the same way as var; exists in the TDZ until initialized.
  • Not redeclarable within the same scope.
  • Reassignable: Can be assigned a new value.

const—The Unchanging Resolve

Nezuko embodies the unchanging resolve with const:

javascript
const demonArt = "Blood Burst";

Characteristics of const:

  • Block-scoped: Like let, it's confined to the block.
  • Not hoisted in the same way as var; subject to TDZ.
  • Not redeclarable within the same scope.
  • Not reassignable: Once assigned, its value cannot be changed.

Chapter 2: Scope—Understanding Accessibility

Function Scope with var

Inosuke demonstrates function scope:

javascript
function battleCry() {
  var cry = "Beast Breathing!";
  console.log(cry);
}
battleCry(); // Outputs: Beast Breathing!
console.log(cry); // Error: cry is not defined

Why can't cry be accessed outside the function?

Insight

Variables declared with var inside a function are not accessible outside that function.

Block Scope with let and const

Tanjiro illustrates block scope:

javascript
if (true) {
  let sense = "Smell";
  const determination = "Unwavering";
  console.log(sense); // Outputs: Smell
  console.log(determination); // Outputs: Unwavering
}
console.log(sense); // Error: sense is not defined
console.log(determination); // Error: determination is not defined

What does this tell us about let and const?

TIP

Variables declared with let and const are only accessible within the block they're defined in.

Chapter 3: Redeclaration and Reassignment

Redeclaration with var

Zenitsu tries to redeclare a variable:

javascript
var technique = "First Form";
var technique = "Sixfold";
console.log(technique); // Outputs: Sixfold

Is this acceptable with var?

TIP

Yes, var allows redeclaration within the same scope.

Redeclaration with let and const

Inosuke attempts the same with let:

javascript
let beastForm = "First Fang";
// let beastForm = "Second Fang"; // Uncaught SyntaxError: Identifier 'beastForm' has already been declared

What happens when we try to redeclare a let variable?

Pitfall

Redeclaring a variable with let or const in the same scope causes an error.

Reassignment with let and const

Nezuko explores reassignment:

javascript
let form = "Normal";
form = "Awakened";
console.log(form); // Outputs: Awakened

const power = "Demon Art";
// power = "Sunlight Resistance"; // Uncaught TypeError: Assignment to constant variable.

Why can form be reassigned but not power?

TIP

Variables declared with let can be reassigned, but const variables cannot be reassigned.

Chapter 4: Hoisting—The Mysterious Elevation

Hoisting with var

Tanjiro encounters hoisting:

javascript
console.log(breathStyle); // Outputs: undefined
var breathStyle = "Water Breathing";

Why is breathStyle undefined instead of causing an error?

Insight

Variables declared with var are hoisted to the top of their scope, but are initialized with undefined.

Hoisting with let and const

Zenitsu tries hoisting with let:

javascript
// console.log(thunderForm); // Uncaught ReferenceError: Cannot access 'thunderForm' before initialization
let thunderForm = "First Form";

What causes the error here?

Pitfall

Variables declared with let and const are hoisted but not initialized, leading to the Temporal Dead Zone (TDZ) where they cannot be accessed before declaration.

Chapter 5: The Temporal Dead Zone (TDZ)

Understanding TDZ

Inosuke explores the TDZ:

javascript
{
  // console.log(beastSense); // Uncaught ReferenceError: Cannot access 'beastSense' before initialization
  let beastSense = "Enhanced Hearing";
  console.log(beastSense); // Outputs: Enhanced Hearing
}

Why can't beastSense be accessed before its declaration?

TIP

The TDZ is the time between entering scope and variable declaration where let and const variables cannot be accessed.

Chapter 6: undefined vs. not defined

undefined Variables

Tanjiro encounters undefined:

javascript
var technique;
console.log(technique); // Outputs: undefined

What does undefined signify here?

TIP

A variable declared but not assigned a value is undefined.

not defined Variables

Nezuko faces a not defined error:

javascript
// console.log(demonForm); // Uncaught ReferenceError: demonForm is not defined

Why does this error occur?

Pitfall

Accessing a variable that hasn't been declared anywhere results in a ReferenceError stating it's not defined.

Chapter 7: Practical Examples and Contrasts

Loop Variables with var vs. let

Zenitsu compares loop behaviors:

javascript
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1000);
}
// Outputs: 3, 3, 3 (after 1 second)

for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 1000);
}
// Outputs: 0, 1, 2 (after 1 second)

Why does var produce 3, 3, 3 and let produce 0, 1, 2?

TIP

var is function-scoped, so the same i is shared across iterations. let is block-scoped, creating a new j for each iteration.

Constants with Mutable Objects

Inosuke tests mutability:

javascript
const equipment = { weapon: "Blades" };
equipment.weapon = "Dual Blades";
console.log(equipment.weapon); // Outputs: Dual Blades

How can a const object be modified?

Insight

const prevents reassignment of the variable binding, but object properties can still be modified.

Chapter 8: Interactive Task—Applying Your Knowledge

Tanjiro needs to declare variables for his mission, ensuring they are accessible only where needed and preventing accidental changes.

Task

  • Declare a block-scoped variable mission with let, assign it "Protect Nezuko".
  • Inside the block, reassign mission to "Defeat Demons".
  • Try to redeclare mission inside the same block.
  • Declare a constant team as an array of team members.
  • Add a new member to team.
  • Attempt to reassign team to a new array.

The Demon Slayer's Solution

Answer
javascript
{
  let mission = "Protect Nezuko";
  mission = "Defeat Demons";
  // let mission = "Train"; // Error: 'mission' has already been declared

  const team = ["Tanjiro", "Nezuko"];
  team.push("Zenitsu");
  console.log(team); // Outputs: ["Tanjiro", "Nezuko", "Zenitsu"]

  // team = ["Inosuke"]; // Error: Assignment to constant variable.
}

Conclusion

By mastering var, let, and const, you've learned to control variable scope, prevent unintended redeclarations or reassignments, and write cleaner, more reliable code—just like the Demon Slayer Corps executes their missions with precision.

Remember:

  • var: Function-scoped, hoisted, redeclarable, reassignable.
  • let: Block-scoped, not hoisted in the same way, not redeclarable, reassignable.
  • const: Block-scoped, not hoisted in the same way, not redeclarable, not reassignable.
  • Hoisting: var declarations are hoisted and initialized with undefined; let and const are hoisted but not initialized, leading to the TDZ.
  • TDZ: The period where let and const cannot be accessed before their declaration.
  • undefined vs. not defined: undefined means the variable exists but has no value; not defined means the variable doesn't exist in any accessible scope.

Farewell, courageous warrior! Continue honing your skills, and may your code be as disciplined as Tanjiro's training and as steadfast as Nezuko's resolve.

Additional Resources 📚

For further exploration:

Farewell

As you continue your journey, may this newfound mastery of var, let, and const empower you to write efficient and error-free code. The world of JavaScript is vast and full of adventures awaiting a hero like you.


The Demon Slayer Corps salutes you!