Este código IIFE puede acceder al conteo
let count = 0; (function immediate() { if (count === 0) { let count = 1; console.log(count); } console.log(count); })();Pero, ¿por qué la cuenta no está definida en este caso?
var count = 0; (function immediate() { if (count === 0) { var count = 1; console.log(count); } console.log(count); })();Si usa var , la declaración de la variable se eleva, lo que significa que su código se reescribirá de la siguiente manera:
var count = 0; (function immediate() { var count; // decalration of variable hoisted on the function scope // and the count variable now is undefined. if (count === 0) { count = 1; console.log(count); } console.log(count); // just this is printed. })();Como puede ver, la variable dentro del bloque if ahora anula el conteo global.
El hecho de que este comportamiento no sea tan obvio es la razón por la que muchos sugieren evitar el uso de var , ya que podemos usar let y const en su lugar, que tienen un alcance de bloque.
Actualizar
Gracias al comentario de @t.niese, creo que es necesario mencionar otra diferencia entre var vs let y const .
Al igual que var , let y const se elevan, pero con estas diferencias: