Hallo,
ich habe in einem String (Response eines http-Requests) Javascriptcode, in dem Variablen und Funktionen definiert werden. Wenn ich diesen Code im Context von window mit eval laufen lasse, kann ich später auf die Variablen und Funktionen zugreifen, da diese unter window angelegt werden. Lasse ich eval aber in einer Funktion laufen, werden die Funktionen und Variablen auch im Context dieser Funktion angelegt und ich habe von außerhalb keinen Zugriff mehr. Siehe folgendes Beispiel:
var code = ""
+ "var x = 1;" + "\n"
+ "window.y = 2;" + "\n"
+ "var fkt1 = function(par) {" + "\n"
+ " alert(par);" + "\n"
+ "}" + "\n"
+ "window.fkt2 = function(par) {" + "\n"
+ " alert(par);" + "\n"
+ "}" + "\n"
+ "function fkt3(par) {" + "\n"
+ " alert(par);" + "\n"
+ "}"; + "\n"
var uebersezte = function() { // Variablen und Funktionen im Context der Funktion
alert("with(window){\n"+code+"\n}");
eval ("with(window){\n"+code+"\n}");
if(typeof x != "undefined") alert(x); else alert("x nicht definiert"); // 1
if(typeof y != "undefined") alert(y); else alert("y nicht definiert"); // 2
if(typeof fkt1 != "undefined") fkt1("fkt1"); else alert("fkt1 nicht definiert"); // fkt1
if(typeof fkt2 != "undefined") fkt2("fkt2"); else alert("fkt2 nicht definiert"); // fkt2
if(typeof fkt3 != "undefined") fkt3("fkt3"); else alert("fkt3 nicht definiert"); // fkt3
}
window.onload = function() {
uebersezte();
if(typeof x != "undefined") alert(x); else alert("x nicht definiert"); // x nicht definiert
if(typeof y != "undefined") alert(y); else alert("y nicht definiert"); // 2
if(typeof fkt1 != "undefined") fkt1("fkt1"); else alert("fkt1 nicht definiert"); // fkt1 nicht definiert
if(typeof fkt2 != "undefined") fkt2("fkt2"); else alert("fkt2 nicht definiert"); // fkt2
if(typeof fkt3 != "undefined") fkt3("fkt3"); else alert("fkt3 nicht definiert"); // fkt3 nicht definiert
}
Ich habe hier schon mit "with" experimentiert, hat aber keinen Erfolg gebracht.
Gibt es eine Möglichkeit, eval im Kontext von window laufen zu lassen? Die im Beispiel bei y und fkt2 angewandte Methode, mit window.y und window.fkt2 zu arbeiten, ist nur eine Notlösung, da ich dann die Script umschreiben müsste.
Gruß, Jürgen