You can prevent undefined
TL;DR: Declare your variables and look after the scope
Problems
Readability
Least Surprise Principle violation
Variable Shadowing
Solutions
Be explicit on declarations
Use 'const' declaration when possible.
Declare variables at the beginning of the scope.
Use strict mode
Context
Hoisting allows variable declarations to be moved to the top of their containing scope during the compilation phase.
Variables declared with var and function declarations are "hoisted" to the top of their respective scopes automatically in several languages.
Sample Code
Wrong
console.log(willBeDefinedLater);
// Output: undefined (but no error)
var willBeDefinedLater = "Beatriz";
console.log(willBeDefinedLater);
// Output: "Beatriz"
Right
const dante = "abandon hope all ye who enter here";
// Declaring a constant 'dante'
// with value "abandon hope all ye who enter here"
console.log(dante);
// Output: "abandon hope all ye who enter here"
dante = "Divine Comedy"; // Error: Assignment to constant variable
Detection
[X] Semi-Automatic
We can perform mutation testing to check if changing the scope of the variables brings unexpected results.
Tags
- Mutability
Conclusion
Hoisting is yet another magic tool some compilers provide to favor lazy programmers.
But if it fights back in debugging time.
Relations
More Info
Disclaimer
Code Smells are my opinion.
Credits
Photo by Ash from Modern Afflatus on Unsplash
The best error message is the one that never shows up.
Thomas Fuchs
This article is part of the CodeSmell Series.