DEV Community

Marvin Roque
Marvin Roque

Posted on

JavaScript Hoisting: The Weird Thing That's Probably Breaking Your Code

Ever had a JavaScript bug where your code seems to run in the wrong order? You might be dealing with hoisting - one of JavaScript's quirky behaviors that can drive developers crazy. Let's break it down in plain English!

The "What in the World?" Moment

Picture this: you're writing some code, and this happens:

console.log(message);  // undefined (but no error 🤔)
var message = "Hello!";

console.log(anotherMessage);  // Error! 💥
let anotherMessage = "Hi!";
Enter fullscreen mode Exit fullscreen mode

If you're scratching your head wondering why the first log gives you undefined instead of an error, welcome to the wild world of hoisting!

What's Actually Happening?

Think of JavaScript as an overeager assistant who reads through your code before running it. When it sees var declarations, it goes "Oh! I'll make a note of these variables right now!" and moves them to the top - but without their values.

Here's what JavaScript actually sees in the first example:

var message;  // JavaScript moved this up!
console.log(message);  // undefined
message = "Hello!";    // Now we assign the value
Enter fullscreen mode Exit fullscreen mode

The Plot Twist: Functions Are Different

Function declarations get the VIP treatment - they're hoisted completely:

sayHi();  // This works! 🎉
function sayHi() {
    console.log("Hello there!");
}

sayBye();  // Error! 💥
const sayBye = () => {
    console.log("Goodbye!");
}
Enter fullscreen mode Exit fullscreen mode

Why? Because function declarations are hoisted with their entire body, while function expressions (like our sayBye arrow function) follow the same rules as variables.

The Modern Way: let and const Save the Day

let and const have a different attitude. They say "No way!" to this hoisting business:

// This creates what we call the "temporal dead zone" ⚠️
console.log(name);  // Error!
let name = "Alice";

console.log(age);   // Error!
const age = 25;
Enter fullscreen mode Exit fullscreen mode

How to Write Better Code (And Keep Your Sanity)

Here's my personal checklist to avoid hoisting headaches:

  1. Declare First, Use Later
// Good ✅
const name = "Alice";
console.log(name);

// Not so good ❌
console.log(name);
var name = "Alice";
Enter fullscreen mode Exit fullscreen mode
  1. Use const and let
// Modern and clear ✅
const PI = 3.14;
let counter = 0;

// Old school and potentially confusing ❌
var PI = 3.14;
var counter = 0;
Enter fullscreen mode Exit fullscreen mode
  1. Keep Function Declarations at the Top
// Functions at the top = happy code 😊
function initialize() {
    // ...
}

function process() {
    // ...
}

// Then use them
initialize();
process();
Enter fullscreen mode Exit fullscreen mode

The Bottom Line

Hoisting is like that one weird rule in a board game that nobody likes but everyone needs to know about. The good news? Stick to const and let, declare things before using them, and you'll rarely have to worry about it!

Quick tip: When in doubt, just remember this mantra: "Declare before use, and stick to const/let!"

Got any hoisting horror stories? Drop them in the comments below - we've all been there! 😅


Found this helpful? Give it a like and follow for more JavaScript explanations that won't make your head spin!

Top comments (0)