¿Cómo funciona la elevación si JavaScript es un lenguaje interpretado?

Tengo entendido que un intérprete ejecuta el programa línea por línea y podemos ver los resultados instantáneos, a diferencia de los lenguajes compilados que convierten el código y luego lo ejecutan.

Mi pregunta es, en Javascript, ¿cómo sabe el intérprete que una variable se declara en algún lugar del programa y la registra comoundefined?

Considere el siguiente programa:

function do_something() {
  console.log(bar); // undefined (but in my understanding about an interpreter, it should be throwing error like variable not declared)
  var bar = 111;
  console.log(bar); // 111
}

Se entiende implícitamente como:

function do_something() {
  var bar;
  console.log(bar); // undefined
  bar = 111;
  console.log(bar); // 111
}

¿Como funciona esto?