2012-06-15 14 views
6

Czy istnieje sposób określenia, który obiekt będzie używany dla globalnego podczas wywoływania eval()?Korzystanie z eval() z niestandardowym globalnym

(Nie pytam jak to zrobić globalną eval()).

ten nie działa, ale to pokazuje, co chciałbym:

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

Chodzi o to, że prawdziwe globalne powiązania są nie ma wpływu na ukrytą deklarację zmiennych (tj. bez słów kluczowych var) w kodzie eval() 'wyd.

Jeśli chodzi o eval.call(pseudoGlobal, "x=12") lub eval.apply(pseudoGlobal, ["x=12"]), niektórzy tłumacze na to nie pozwalają.

+1

Celem jest utworzenie izolowanego/kontrolowanego/bezpiecznego środowiska wykonawczego w samej Javascript. – gawi

Odpowiedz

3

Można, oczywiście, zastępować domyślne obiektu dla przypisywania wartość nieruchomości, jak w

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

ale nie dla tworzenia propery. Jeśli właściwość nie zostanie znaleziona w bieżącym stosie kontekstów wykonania, zostanie utworzona w obiekcie globalnym. To wszystko. Można spróbować jakieś dziwne rzeczy, także:

//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]; 
} 

Jeśli dbasz o globalnych powiązań, spróbuj:

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

ten sposób wiązania zostanie zmieniona w globalvars. Zwróć uwagę, że płytka kopia uniemożliwi zmianę tylko jednego poziomu bingingu.

+0

Odnośnie drugiego bloku kodu, nie uniemożliwia to skryptowi zmiany powiązań w rzeczywistym obiekcie globalnym. – gawi

+0

Wziąłem twoje pytanie w wartości nominalnej, ale nadal nie wszystko jest stracone ... Zaktualizowałem odpowiedź –

+0

A jeśli zrobię 'eval (" użyj ścisłego "," + kod) ', a to ogranicza kod, który może być eval() 'ed, to zapobiega tworzeniu dodatkowych wiązań w zasięgu globalnym. Pozostawia nam to możliwe mutacje wiązań poziomu 2 +. – gawi

1

Nie ma wbudowanego sposobu, aby to zrobić.

Istnieją dwa rozwiązania, które przychodzą do głowy:

  • Przedrostek wszystkie zadania w kodzie eval ed. tj. zamiast x = 12 trzeba zrobić coś w rodzaju o.x = 12.
  • Napisz własny interpreter JavaScript, który śledzi scenariusz i zwraca obiekt ze wszystkimi przypisanymi zmiennymi.
+0

Szkoda, że ​​nie możemy stworzyć własnego środowiska wykonawczego z Javascriptem. Musi istnieć jakiś dobry powód, dla JavaScript, aby temu zapobiec. Mam wrażenie, że jest to trochę bardziej skomplikowane, niż myślę (łańcuchy prototypów, konstruktory, funkcje natywne?). – gawi