Como funciona o içamento se o JavaScript é uma linguagem interpretada?

Meu entendimento de um intérprete é que ele executa o programa linha por linha e podemos ver os resultados instantâneos, diferentemente das linguagens compiladas que convertem o código e o executam.

Minha pergunta é, em Javascript, como o intérprete sabe que uma variável é declarada em algum lugar do programa e a registra comoundefined?

Considere o programa abaixo:

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
}

É implicitamente entendido como:

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

Como é que isso funciona?

questionAnswers(2)

yourAnswerToTheQuestion