Why You Can Call a Function Before It's Defined in JavaScript (and Why You Shouldn't)
- Function declarations (using the
function
keyword followed by the function name) are hoisted during the compilation phase. This means that JavaScript engine treats them as if they were declared at the very beginning of their scope (like a script or a block of code wrapped in curly braces{}
). - Function expressions (functions assigned to variables) and arrow functions are not hoisted. You cannot call them before they are defined.
Example of hoisting:
function greet() {
console.log("Hello!");
}
greet(); // This will work!
console.log(typeof greet); // This will also work and output "function"
// Because the function declaration is hoisted to the top.
In this example, even though the greet
function is defined after it's called, the call works because the function declaration is hoisted to the top of its scope (the script in this case).
Things to keep in mind:
- While hoisting can be convenient at times, it can also lead to unexpected behavior in your code, especially when dealing with complex interactions between functions and variables.
- It's generally considered a good practice to avoid relying on hoisting and always define functions before using them. This makes your code more readable and predictable.
- If you're using modern JavaScript features like
let
andconst
for variable declarations, they are not hoisted and will behave as expected (you cannot use them before they are defined).
javascript function