What is the difference between let, var, and const in JavaScript? [duplicate]

I understand the basics of let, var, and const in JavaScript, but I’m curious about the more advanced nuances and edge cases. Here’s what I’m exploring deeper into some advanced aspects:

Scope: How do block-scoping (let and const) and function-scoping (var) behave in nested contexts or closures?
Hoisting: Why do let and const remain in the temporal dead zone, and how can this lead to runtime errors?
Re-declaration: How do let and const restrictions on re-declaration impact variable shadowing?
Mutation: How do you enforce immutability for objects or arrays declared with const?
Best Practices: Are there cases where using var is still appropriate in modern JavaScript?