Wo befindet sich der unveränderliche Bindungsdatensatz des Bezeichners in einem in JavaScript gespeicherten Funktionsausdruck?

or kurzem bin ich auf einige interessante Fakten über benannte Funktionsausdrücke (NFE) gestoßen. Ich verstehe, dass auf den Funktionsnamen eines NFE innerhalb des Funktionskörpers zugegriffen werden kann, was die Rekursion bequemer macht und uns @ erspararguments.callee. Und der Funktionsname ist außerhalb des Funktionskörpers nicht verfügbar. Beispielsweise

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

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

Dies ist eine gut dokumentierte Funktion, und Kangax hat eine wunderbarePos über NFE und erwähnte dieses Phänomen dort. Was mich am meisten überrascht, ist, dass der Funktionsname eines NFE nicht mit anderen Werten im Funktionskörper verknüpft werden kann. Beispielsweise

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

Im obigen Beispiel haben wir versucht, den Bezeichner @ neu zu bindefoo mit einem anderen Wert5. Das scheitert aber! Und ich wandte mich an ES5 Spec und stellte fest, dass ein unveränderlicher Bindungsdatensatz erstellt und zu den Umgebungsdatensätzen der lexikalischen Umgebung hinzugefügt wurde, als ein NFE erstellt wurde.

Das Problem ist, wenn ein NFE auf seinen eigenen Funktionsnamen im Funktionskörper verweist, der Name als @ aufgelöst wurdfree variable. Im obigen Beispiel istfoouf @ wird im NFE verwiesen, es ist jedoch weder ein formaler Parameter noch eine lokale Variable dieser Funktion. Es ist also eine freie Variable und ihr Bindungsdatensatz kann über die Eigenschaft [[scope]] des NFE aufgelöst werden.

So bedenken Sie dies, wenn wir einen anderen Bezeichner mit dem gleichen Namen im äußeren Bereich haben, scheint es einen Konflikt zu geben. Beispielsweise

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

Wenn wir das NFE ausführen, wird dasfree variable foo wurde in die Funktion aufgelöst, der es zugeordnet ist. Wenn das Steuerelement den NFE-Kontext verlässt, wirdfoo wurde als lokale Variable im äußeren Bereich aufgelöst.

Also meine Frage ist wie folgt:

Wo wird der unveränderliche Bindungssatz des Funktionsnamens gespeichert?Wie kommt der Funktionsnamefoo überwiegenvar foo = 1 wann in NFE gelöst? Werden ihre verbindlichen Aufzeichnungen in derselben lexikalischen Umgebung gespeichert? Wenn das so ist, wie Was steckt hinter dem Phänomen, dass Funktionsnamefoo ist innen zugänglich aber außen unsichtbar?

Kann jemand mit der ES5-Spezifikation etwas Licht ins Dunkel bringen? Ich finde nicht viel Diskussion online.