2016-07-20 14 views
-1

Zum Beispiel, wenn ich dieses:Zugriff auf globale Variablen in einem neuen Funktionskontext?

var foo = 444; 

var x = new Function("console.log('5'); console.log(foo);"); 

x(); 

Es sagt foo nicht definiert ist. Ich möchte auf foo und viele andere globale Variablen innerhalb dieses new Function Kontextes zugreifen können.

Eine Lösung ist:

var foo = 444; 

var x = new Function('foo', "console.log('5'); console.log(foo);"); 

x(foo); 

Dies erfordert jedoch alles, die durch als separaten Parameter. Zu umständlich.

Die einzige Alternative, die ich von IS denken kann, hat ein Container-Objekt jede einzelne Variable halten und dann passiert nur, dass die Behälter:

var container = { }; 

container.foo = 444; 

var x = new Function('container', "console.log('5'); console.log(container.foo);"); 

x(container); 

Aber das erfordert, um die Behälter all meine Variablen zu setzen habe.

Ich kann nicht etwas tun:

var x = new Function('container', "console.log('5'); console.log(" + foo + ");"); 

weil ich foo zum Zeitpunkt der Funktion exeuction bewerten müssen. Nicht wenn x deklariert ist.

Ich weiß, mit new Function verwendet Eval und es ist in der Regel böse. Ich schreibe einen Code Parser und ich versuche, es zu optimieren, also verwende ich es trotzdem.

+0

_ „zu schaffen, aber das erfordert, die ein jeder setzen von meinen Variablen in den Container. "_ - die kürzeste Syntax ist' var container = {foo: 444}; '. Keine Notwendigkeit für all diese "Container" ... "=" ... ';" Zeilen. – Xufox

+0

@Xufox: Ja, ich sage, dass 'foo' nicht die einzige Variable ist, auf die ich zugreifen muss. Wahrscheinlich 20+ –

+0

Sie * können * auf globale Variablen im 'neuen Funktions'-Code zugreifen. Wenn Sie nicht auf 'foo' zugreifen können, deutet das nur darauf hin, dass' foo' nicht global ist. In welcher Umgebung führen Sie dieses Skript aus? – Bergi

Antwort

-1

Eine einfache Lösung ist die Variable setzen auf window

window.foo = 444; 
window.foo2 = 555; 
window.foo3 = 666; 
var x = new Function("console.log('5'); console.log(window.foo);"); 
x(); 

Eine weitere Option ist eine weitere Funktion, die Sie mit den konstanten Werten

function globalContainer(){ 
    return {foo: 444, foo1: 555, foo2: 666}; 
} 

var x = new Function("console.log('5'); console.log(globalContainer().foo);"); 
x(); 
+0

Ja das ist im Grunde der Container-Ansatz. Ich möchte vermeiden, das Fensterobjekt hinzuzufügen. –

+0

Nicht ganz. Sie müssen das 'Fenster'-Objekt nicht an einzelne Funktionen übergeben. Ich habe meine Antwort mit Beispielcode aktualisiert. –

+0

Ja, aber ich möchte das Fenster nicht ändern, da es in Node/Browser verwendet wird und nicht mit anderen kollidieren soll. –