2012-02-05 33 views
6

Por favor, tenga en cuenta los dos fragmentos de código (las primeras impresiones "eval local", la segunda imprime "eval Global"):Distinguir eval local desde eval mundial

(function f() { 
    var x; 
    try { 
     eval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

y

var globalEval = eval; 
(function f() { 
    var x; 
    try { 
     globalEval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

Se resulta que aunque globalEval === eval evalúa a true, globalEval y evalse comportan de manera diferente porque tienen diferentes nombres. (Una evaluación solo puede ser local si está escrita con precisión eval.)

¿Cómo puedo distinguir dos evaluaciones? ¿Hay alguna manera de extraer etiquetas de variables para inferir el comportamiento?

+0

@MattiVirkkunen: Estoy tratando de construir un ejemplo de [esto] (http://stackoverflow.com/questions/7223517/pure-function-given-strictly-equal-arguments-yielding-non-strictly-equal -resultados). Estoy cerca, pero no del todo todavía. – Randomblue

+0

¿Por qué no te quedaste con [tu pregunta anterior] (http://stackoverflow.com/questions/9145385/accessing-local-eval-inside-function-scope)? –

+0

@amnotiam: Es un poco diferente, y me confundí. Desearía poder borrarlo – Randomblue

Respuesta

2

Interesante. Pero como usted tiene el control de dónde/cuándo se define su referencia al eval, puede decir cómo distinguirlos. Por ejemplo, tenga un objeto que tenga el "puntero de función" Y algo para indicar el alcance: si lo define, sabe dónde se encuentra.

I.e. myEvaluator.scope le informaría sobre dónde se capturó el alcance eval y se podría usar myEvaluator.eval para evaluar.