- *`var`:*
- Function-scoped.
- Hoisted and initialized with `undefined`.
- Can be re-declared within the same scope without an error.
- *`let`:*
- Block-scoped.
- Hoisted but not initialized (temporal dead zone).
- Cannot be re-declared within the same scope.
For most scenarios, it's preferable to use `let` due to its block-scoping and more predictable behavior.