2012-06-15 8 views
6

Gibt es eine Möglichkeit anzugeben, welches Objekt für global beim Aufruf eval() verwendet werden soll?Verwendung von eval() mit einem benutzerdefinierten globalen

(Ich frage nicht, wie die globale eval() zu tun.)

Dies funktioniert nicht, aber das zeigt, was würde Ich mag:

var pseudoGlobal = {}; 
eval("x = 12", pseudoGlobal); 
pseudoGlobal.x; // 12 

Der Punkt ist, dass die realen globale Bindungen sind nicht betroffen durch implizite Variablendeklaration (dh ohne var Schlüsselwörter) im Code eval() 'ed.

Wie für eval.call(pseudoGlobal, "x=12") oder eval.apply(pseudoGlobal, ["x=12"]), erlauben einige Dolmetscher es nicht.

+1

Die Absicht ist, eine isolierte/kontrollierte/sichere Ausführungsumgebung in Javascript selbst zu erstellen. – gawi

Antwort

3

Sie können natürlich Ersatz Standardobjekt für Zuordnung einen Eigenschaftswert, wie in

with (pseudoGlobal) eval("x=12") 

aber nicht für ein propery zu schaffen. Wenn eine Eigenschaft im aktuellen Stapel von Ausführungskontexten nicht gefunden wird, wird sie im globalen Objekt erstellt. Das ist alles dazu. Sie könnten einige seltsame Dinge versuchen, auch:

//global code 
var globalvars = {}; 
for (i in this) 
    globalvars[i] = null; 
with (pseudoGlobal) 
    eval("x=12") 
for (i in this) 
    if (!(i in globalvars)) 
{ 
    pseudoGlobal[i] = this[i]; 
    delete this[i]; 
} 

Wenn Sie über die globale Bindungen kümmern, versuchen:

var globalvars = {}; 
for (i in this) 
    globalvars[i] = this[i]; 
with (globalvars) 
    eval("x=12") 

auf diese Weise die Bindungen in globalvars geändert werden. Beachten Sie, dass diese flache Kopie nur eine Ebene der Bingings verhindert.

+0

In Bezug auf Ihren zweiten Codeblock verhindert dies nicht, dass ein Skript Bindungen im realen globalen Objekt ändert. – gawi

+0

Ich nahm Ihre Frage zum Nennwert, aber immer noch nicht alles ist verloren ... Aktualisierte die Antwort –

+0

Und wenn ich 'eval ('' verwenden strict"; '+ code) ', während es den Code einschränkt, der eval sein kann() "Damit verhindern Sie, dass zusätzliche Bindungen im globalen Umfang erstellt werden. Dies lässt uns mögliche Mutationen der Level-2 + -Bindungen. – gawi

1

Es gibt keine integrierte Möglichkeit, dies zu tun.

Es gibt zwei Lösungen, die in den Sinn kommen:

  • Präfix alle Zuordnungen in der eval ed-Code. das heißt, anstelle von x = 12 müssten Sie etwas wie o.x = 12 machen.
  • Schreiben Sie Ihren eigenen Javascript-Interpreter, der das Skript sandboxiert und ein Objekt mit allen zugewiesenen Variablen zurückgibt.
+0

Schade, dass wir keine eigene Ausführungsumgebung mit Javascript erstellen können. Es muss einen guten Grund für Javascript geben, um dies zu verhindern. Ich habe das Gefühl, dass es ein bisschen komplizierter ist als ich denke (Prototypenketten? Konstruktoren? Native Funktionen?). – gawi

Verwandte Themen