2012-06-15 13 views
6

¿Hay alguna manera de especificar qué objeto usar para global al invocar eval()?Uso de eval() con un global personalizado

(no estoy preguntando cómo hacer eval mundial()).

Esto no está funcionando pero esto ilustra lo que me gustaría:

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

El punto es que las consolidaciones globales son reales no afectado por la declaración de variable implícita (es decir, sin var palabras clave) en el código eval() 'ed.

En cuanto a eval.call(pseudoGlobal, "x=12") o eval.apply(pseudoGlobal, ["x=12"]), algunos intérpretes no lo permitirán.

+1

El objetivo es crear un entorno de ejecución aislado/controlado/seguro dentro del propio Javascript. – gawi

Respuesta

3

Usted puede, por supuesto, objeto predeterminado sustituto para la asignación de un valor de propiedad, como en

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

pero no para crear un hotel fenomenal. Si una propiedad no se encuentra en la pila actual de contextos de ejecución, se crea en el objeto global. Eso es todo al respecto. Usted puede tratar algunas cosas extrañas, también:

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

Si se preocupan por las consolidaciones globales, tratan:

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

esta manera los enlaces serán cambiados en globalvars. Tenga en cuenta que esa copia superficial evitará que cambie un solo nivel de bingings.

+0

En cuanto a su segundo bloque de código, esto no impide que un script cambie los enlaces en el objeto global real. – gawi

+0

Respondí tu pregunta al pie de la letra, pero aún no todo está perdido ... Actualicé la respuesta –

+0

Y si hago 'eval ('" use strict ";' + code)', mientras que restringe el código que puede ser eval() 'ed, esto evita que se creen enlaces adicionales en el alcance global. Esto nos deja con posibles mutaciones de enlaces de nivel 2 +. – gawi

1

No hay una forma integrada de hacerlo.

Hay dos soluciones que vienen a la mente:

  • prefijo todas las asignaciones en el código eval ed. es decir, en lugar de x = 12, tendría que hacer algo como o.x = 12.
  • Escriba su propio intérprete de JavaScript que pone a prueba el script y devuelve un objeto con todas las variables asignadas.
+0

Lástima que no podemos crear nuestro propio entorno de ejecución con Javascript. Debe existir una buena razón para Javascript para evitar esto. Tengo la sensación de que es un poco más complicado de lo que creo (¿cadenas de prototipos, constructores, funciones nativas?). – gawi

Cuestiones relacionadas