2012-06-15 19 views
6

eval() çağrılırken hangi nesnenin global için kullanılacağını belirtmenin bir yolu var mı? Bu işe yaramıyorÖzel bir global ile eval() kullanma

(. Küresel eval() nasıl sormuyorum) ama bu ne istiyorsunuz göstermektedir:

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

noktası gerçek küresel bağlamaları olmasıdır örtük değişken bildirimi tarafından etkilenmez (yani var anahtar sözcükleri olmadan) kodunda eval() 'ed.

eval.call(pseudoGlobal, "x=12") veya eval.apply(pseudoGlobal, ["x=12"])'a gelince, bazı tercümanlar buna izin vermez.

+1

Amaç, Javascript'in içinde yalıtılmış/kontrollü/güvenli bir yürütme ortamı oluşturmaktır. – gawi

cevap

3

Elbette, yedek varsayılan nesne için bir emlak oluşturmak için

yılında
with (pseudoGlobal) eval("x=12") 

ancak gibi bir özellik değeri atayarak yapabilirsiniz. Geçerli yürütme bağlamında bir özellik bulunmazsa, genel nesnede oluşturulur. Hepsi bu kadar var. Ayrıca, bazı garip şeyler deneyebilirsiniz: Eğer küresel bağlamaları önem veriyorsanız

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

, deneyin: bağlamaları globalvars içinde değişecektir

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

bu şekilde. Not, bu sığ kopya sadece bir seviye tıkanıklıkların değişmesini engelleyecektir.

+0

İkinci kod bloğunuzla ilgili olarak, bu, bir komut dosyasının gerçek genel nesnedeki bağları değiştirmesini engellemez. – gawi

+0

Sorunu yüz değeriyle aldım, ancak hala hepsi yok ... Yanıtı güncelledim –

+0

Ve eğer eval ('"use use"; "+ code)")() 'dir, bu, global kapsamda oluşturulacak ek bağlardan korunuyor. Bu, bizi olası seviye 2 + bağlamalarının mutasyonları ile bırakır. – gawi

1

Bunu yapmak için yerleşik bir yol yoktur. eval ed kodunda

  • Önek tüm atamaları:

    akla gelen iki çözümü vardır. Yani, x = 12 yerine, o.x = 12 gibi bir şey yapmanız gerekir.

  • Kendi Javascript yorumlayıcınızı, komut dosyasını korumalı hale getirerek, atanan tüm değişkenlerle birlikte bir nesne döndürür.
+0

Çok kötüsü Javascript ile kendi yürütme ortamımızı oluşturamıyoruz. Bunu önlemek için Javascript'in iyi bir sebebi olmalı. Benim düşündüğümden biraz daha karmaşık olduğu hissine kapılıyorum (Prototip zincirleri? Yapıcılar? Yerli fonksiyonlar?). – gawi