Boa noite, Marcos.
Sim, dentro da função existe um novo escopo. No entanto, já que não existe a variável 'global' dentro deste novo escopo, o interpretador do JavaScript então procura a referência no escopo superior, encontrando então o valor '1', como mencionado.
Tente neste mesmo exemplo que você deu, adicionar dentro da função a seguinte linha:
var global = 10;
Logo em seguida você pode printar ou realizar qualquer alteração na variável 'global'. O valor da variável de fora não poderá mais ser alterado dentro dessa função.
Mas pode haver sobrescrita sim! Se você não criar uma referência local ("var global") dentro da função a referência de fora será usada e pode ser alterada sim.
var global = 1;
function func () {
global = 5;
teste = global;
console.log(global);
}
func();
console.log(global);
Este código retorna " 5 5 ", por exemplo.
Enquanto que este outro retorna " 5 1 ":
var global = 1;
function func () {
var global = 5;
teste = global;
console.log(global);
}
func();
console.log(global);
EDIT: É interessante mencionar também o chamado "Hoist". É um mecanismo em JavaScript que faz com que as declarações de variáveis sejam 'movidas' para o todo da fila de execução dentro de um determinado escopo. Em outras palavras, mesmo se você usar a variável 'global' dentro da função antes de declarar a variável 'global' como variável local (neste escopo) a mesma será tratada como uma variável local por que o JavaScript 'puxa' a declaração para o início da fila de execução, antes dela ser usada.
Um código como este abaixo, por exemplo, não altera o valor da variável do escopo superior e os valores " 5 1 " serão printados.
var global = 1;
function func () {
global = 10;
var global = 5;
console.log(global);
}
func();
console.log(global);