Frage

ECMA-262 5.1 Unterabschnitte 10.4.2 Und 10.4.2.1 Beziehen Sie sich auf einen "aufrufenden Kontext". Dies scheint an keiner anderen Stelle des Dokuments beschrieben zu werden.

Ich zitiere die Spezifikation, Hervorhebung von mir:

10.4.2 Evaluierungscode eingeben

Die folgenden Schritte werden ausgeführt, wenn die Steuerung in den Ausführungskontext für Evaluierungscode eintritt:

  1. Wenn nein Aufrufkontext oder wenn der Eval-Code nicht durch einen direkten Aufruf (15.1.2.1.1) der Eval-Funktion ausgewertet wird, dann

10.4.2.1 Strikte Modusbeschränkungen

Der Evaluierungscode kann keine Variablen- oder Funktionsbindungen in der Variablenumgebung von instanziieren Aufrufkontext das hat die Auswertung aufgerufen, wenn entweder der Code der Aufrufkontext oder der Evaluierungscode ist ein strikter Code.Stattdessen werden solche Bindungen in einer neuen Variablenumgebung instanziiert, auf die nur der Auswertungscode zugreifen kann.

  • Was bedeutet in diesen Absätzen „Kontext aufrufen“?Ich würde annehmen, dass es sich auf die bezieht Ausführungskontext oben auf dem Stapel kurz davor eval wird genannt;Kann das jemand verifizieren?

  • Was bedeutet es, "keinen Anrufkontext" zu haben? Kann jemand ein Beispiel für Code oder Bedingungen bereitstellen, die zu einem Aufruf von eval ohne Aufrufkontext?

War es hilfreich?

Lösung

Der „Aufrufkontext“ bezieht sich auf den Kontext, den der Eingeborene hat eval Funktion wird aufgerufen von.

Wenn Sie ausführen eval aus einem nativen Code (zum Beispiel führen Sie eine native Funktion aus, die nach Abschluss Code ausführt) mit eval aus irgendeinem Grund), dann hätte es keinen Kontext, der dann für die Ausführung im globalen Bereich spezifiziert wird.Der Kontext bezieht sich nur auf ausführbaren ECMAScript-Code.

Der aufrufende Kontext bezieht sich jedoch auf die Variablen und Anweisungen im Ausführungskontext des Ortes, an dem er aufgerufen wird.Es weiß beispielsweise nur, dass eval als strikter Code funktionieren soll, wenn es den aufrufenden Kontext überprüft.

Dies wird durch eine sehr ähnliche Frage in der ES-Discuss-Mailingliste verdeutlicht, wo Brendan Eich (der Ersteller von JavaScript) antwortet:

Wie kann Evaluierungscode keinen Aufrufkontext haben?

ES3 sagt:

10.2.2 Evaluierungscode

Wenn das Steuerelement in einen Ausführungskontext für eval-Code, der vorherige aktive Ausführungskontext, der als aufrufenden Kontext, wird verwendet, um die Bereichskette zu bestimmen, die Variable -Objekt und den this-Wert.Wenn kein Aufrufkontext vorhanden ist, dann Initialisierung der Bereichskette, Variableninstanziierung und Die Ermittlung des this-Wertes erfolgt wie bei globalem Code.

Ich bin verblüfft über „Wenn es keinen Aufrufkontext gibt“.Wie könnte die Möglichkeit entstehen?Wie würde eval angerufen werden, wenn niemand anruft?

Antwort:

Ein Aufruf von nativem Code, dem „Host“-Programm.

Einige Browser unterstützen indirekt eval, was Folgendes ermöglicht:

setTimeout(eval, 0, "alert('hi mom')");

Das verwendete Fenster ist dasjenige, in dem setTimeout wurde entlang der Scope-Kette, also

myFrame.setTimeout(eval, 0, "alert(x)");

sollte zeigen myFrame.x, nicht der aufrufende Frame oder das aufrufende Fenster x.

Notiz: myFrame bezieht sich in diesem Fall auf den globalen Bereich des Frames.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top