Olá! Tudo bem? Nesse caso existem duas variáveis x que tem valores diferentes mas nome iguais. O que acontece é que como a segunda x foi declarada dentro do bloco (região de código limitada por {}) de uma function ela se torna acessível somente dentro desse mesmo bloco da function. Isso significa que a primeira x é uma variável global que pode ser acessada em qualquer parte do código, enquanto a segunda x é uma variável restrita a function soma. A primeira x poderia ser acessada dentro da function soma, mas como a segunda x foi declarada dentro da própria function essa segunda acaba tendo prioridade de chamada, por isso o resultado deu 7 e não 12. Vou te mostrar alguns casos:
var x = 10;
var b = 2;
function soma (){
var x = 5;
document.write(x + b); // Escreve 7
}
soma();
document.write(x); // Escreve 10
Chamando de novo a variável x fora do bloco da function temos o valor da primeira x de volta. Agora veja o que acontece se não tivesse a declaração da primeira x:
var b = 2;
function soma (){
var x = 5;
document.write(x + b); // Também escreve 7
}
soma();
document.write(x); // Dá erro, porque nesse caso a variável x foi declarada somente dentro da função
Nesse caso quando tentamos chamar a variável x que foi declarada dentro da function acontece um erro, porque quando uma var nasce dentro de uma function ela também "morre" na própria function. Agora e se tentarmos mudar o valor de uma variável dentro da function:
var x = 10;
var b = 2;
function soma (){
x = 5;
document.write(x + b); // Nesse caso também é escrito 7
}
soma();
document.write(x); // Dessa vez aparece 5
Perceba que dessa vez nós reatribuímos o valor da variável x, que passou a valer 5. Resumindo, nos primeiros casos nós tínhamos duas variáveis diferentes, que tinham o mesmo nome, porém áreas de atuação diferentes (uma global var x = 10; e outra própria de uma function var x = 5;), enquanto nesse último caso tivemos uma variável x que começou com o valor 10 e depois teve seu valor reatribuído para 5, porém continuou sendo a mesma variável, ou seja, sempre que usamos a palavra var nós vamos estar criando uma variável diferente.
var x = 10;
var x = 8
var b = 2;
function soma (){
var x = 5;
document.write(x + b); // Nesse caso também é escrito 7
}
soma();
document.write(x); // Aparece 8
Nesse último caso, temos três variáveis x, porém dentro da função a var x = 5 tem a prioridade, e fora da função a var x = 8 acaba tendo prioridade sobre a var x = 10, já que a var x = 8 foi declarada por último. É um tópico complexo, mas espero ter esclarecido um pouco sua dúvida!