JürgenB: Eval und Context

Beitrag lesen

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  
   }  

Link zur Testseite

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