JavaScript Variables: Declaration, Hoisting, and Scopes Explained