Onde está o registro de ligação imutável do identificador em uma expressão de função nomeada armazenada em JavaScript?

Recentemente, me deparei com alguns fatos interessantes sobre expressões de funções nomeadas (NFE). Entendo que o nome da função de uma NFE pode ser acessado dentro do corpo da função, o que torna a recursão mais conveniente e nos salvaarguments.callee. E o nome da função não está disponível fora do corpo da função. Por exemplo,

var foo = function bar() {
    console.log(typeof bar);
}; 

typeof foo; // 'function'
typeof bar; // 'undefined', inaccessible outside the NFE
foo(); // 'function', accessible inside the NFE

Esse é um recurso bem documentado, e o kangax tem uma maravilhosapostar sobre a ENF e mencionou esse fenômeno lá. O que mais me surpreende é que o nome da função de uma ENF não pode ser associado a outros valores no corpo da função. Por exemplo,

(function foo() {
    foo = 5;
    alert(foo);
})(); // will alert function code instead of 5

No exemplo acima, tentamos religar o identificadorfoo com outro valor5. Mas isso falha! E virei para o ES5 Spec e descobri que um registro de ligação imutável foi criado e adicionado aos registros de ambiente do ambiente lexical quando um NFE é criado.

O problema é que, quando uma ENF se refere ao seu próprio nome de função dentro do corpo da função, o nome foi resolvido como umvariável livre. No exemplo acima,foo é referido dentro da NFE, mas não é um parâmetro formal nem uma variável local dessa função. Portanto, é uma variável livre e seu registro de ligação pode ser resolvido através da propriedade [[scope]] da NFE.

Portanto, considere isso, se tivermos outro identificador com o mesmo nome no escopo externo, parece haver algum conflito. Por exemplo,

var foo = 1;
(function foo() {
    alert(foo);
})(); // will alert function code rather than 1
alert(foo); // 1

Quando executamos a ENF, ovariável livre foo foi resolvido para a função à qual está associado. Mas quando o controle sai do contexto da NFE,foo foi resolvido como uma variável local no escopo externo.

Então, minha pergunta é a seguinte:

Onde está armazenado o registro de ligação imutável do nome da função?Como é que o nome da funçãofoo superamvar foo = 1 quando resolvido dentro da NFE? Seus registros de ligação são armazenados no mesmo ambiente lexical? Se sim, como?O que está por trás do fenômeno que nome da funçãofoo é acessível por dentro, mas invisível por fora?

Alguém pode esclarecer isso com as especificações do ES5? Não encontro muita discussão online.

questionAnswers(1)

yourAnswerToTheQuestion