¿Dónde está el registro de enlace inmutable del identificador en una expresión de función con nombre almacenada en JavaScript?

Recientemente me encontré con algunos datos interesantes sobre las expresiones de funciones con nombre (NFE). Entiendo que se puede acceder al nombre de la función de una NFE dentro del cuerpo de la función, lo que hace que la recursión sea más conveniente y nos ahorraarguments.callee. Y el nombre de la función no está disponible fuera del cuerpo de la función. Por ejemplo,

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

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

Esta es una característica bien documentada, y Kangax tiene una maravillosaenviar sobre NFE y mencioné este fenómeno allí. Lo que más me sorprende es que el nombre de la función de una NFE no se puede volver a asociar con otros valores en el cuerpo de la función. Por ejemplo,

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

En el ejemplo anterior, intentamos volver a vincular el identificadorfoo con otro valor5. Pero esto falla! Y recurrí a ES5 Spec y descubrí que se creó un registro de enlace inmutable y se agregó a los registros de entorno del entorno léxico cuando se crea un NFE.

El problema es que cuando una NFE se refiere a su propio nombre de función dentro del cuerpo de la función, el nombre se resolvió como unvariable libre. En el ejemplo anterior,foo se hace referencia dentro de la NFE, pero no es un parámetro formal ni una variable local de esta función. Por lo tanto, es una variable libre y su registro vinculante se puede resolver a través de la propiedad [[alcance]] de la NFE.

Considere esto, si tenemos otro identificador con el mismo nombre en el ámbito externo, parece haber algún conflicto. Por ejemplo,

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

Cuando ejecutamos el NFE, elvariable libre foo se resolvió con la función a la que está asociado. Pero cuando el control sale del contexto NFE,foo se resolvió como una variable local en el ámbito externo.

Entonces mi pregunta es la siguiente:

¿Dónde se almacena el registro de enlace inmutable del nombre de la función?¿Cómo es que el nombre de la funciónfoo pesar más quevar foo = 1 cuando se resuelve dentro de NFE? ¿Se almacenan sus registros vinculantes en el mismo entorno léxico? ¿Si es así, cómo?¿Qué hay detrás del fenómeno que nombre de funciónfoo es accesible por dentro pero invisible por fuera?

¿Alguien puede arrojar algo de luz sobre esto con la especificación ES5? No encuentro mucha discusión en línea.

Respuestas a la pregunta(1)

Su respuesta a la pregunta