- *`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.