Se diferencian en tres aspectos: el ámbito (scope), el comportamiento del hoisting y la reasignación.
js
() {
() {
a = ;
b = ;
c = ;
}
.(a);
.(b);
}
Se diferencian en tres aspectos: el ámbito (scope), el comportamiento del hoisting y la reasignación.
() {
() {
a = ;
b = ;
c = ;
}
.(a);
.(b);
}
var tiene ámbito de función (function-scoped), se eleva (hoisting) e inicializa con undefined, y se puede volver a declarar. Esto provoca fugas sorprendentes — evítalo.let tiene ámbito de bloque (block-scoped) ({ }), se puede reasignar y vive en la zona muerta temporal (temporal dead zone) hasta la línea de su declaración (acceder a él antes lanza un error).const tiene ámbito de bloque y no se puede reasignar — pero ten en cuenta que la constante es el enlace (binding), no el valor:const user = { name: "Ann" };
user.name = "Bob"; // ✅ allowed — mutating the object, not reassigning
user = {}; // ❌ TypeError — can't rebind `user`
Usa const por defecto; cambia a let solo cuando debas reasignar; nunca uses var en código nuevo. Esto deja clara la intención ("esto no cambiará") y evita las fugas de ámbito y la confusión del hoisting que trae var.