Bucles anidados y ámbito de variables en JavaScript

Si tenemos un bucle dentro de otro, las variables declaradas en el bucle externo estarán disponibles en el interno. En el siguiente ejemplo, la variable num está disponible en el bucle interno:

javascriptfor (let i = 0; i <= 9; i++) {
  let num = 3;
  
  for (let j = 0; j <= 9; j++) {
    console.log(num); // mostrará 3
  }
}

Pero fuera del bucle externo, la variable num no está disponible:

javascriptfor (let i = 0; i <= 9; i++) {
  let num = 3;
  
  for (let j = 0; j <= 9; j++) {
    
  }
}

console.log(num); // dará un error

Las variables declaradas en el bucle interno no están disponibles fuera:

javascriptfor (let i = 0; i <= 9; i++) {
  for (let j = 0; j <= 9; j++) {
    let num = 3;
  }
  
  console.log(num); // dará un error
}

console.log(num); // dará un error