2012-02-05 28 views
6

Si prega di considerare i due frammenti di codice (le prime stampe "eval locale", il secondo stampe "eval Globale"):Distinguere eval locale da eval globale

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

e

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

E ' risulta che, sebbene globalEval === eval valuti a true, globalEval e evalsi comportino diversamente perché hanno nomi diversi. (Una valutazione può essere locale solo se è scritta con precisione eval.)

Come posso distinguere tra due evali? C'è un modo per estrarre le etichette variabili per inferire un comportamento?

+0

@MattiVirkkunen: Sto provando a creare un esempio di [questo] (http://stackoverflow.com/questions/7223517/pure-function-given-strictly-equal-argoment-yielding-non-strictly-equal -i risultati). Sono vicino, ma non ancora del tutto. – Randomblue

+0

Perché non ti sei limitato a [la tua domanda precedente] (http://stackoverflow.com/questions/9145385/accessing-local-eval-inside-function-scope)? –

+0

@amnotiam: È un po 'diverso, e mi sono confuso. Vorrei poterlo cancellare. – Randomblue

risposta

2

Interessante. Ma dal momento che hai il controllo su dove/quando viene definito il tuo riferimento a eval, puoi dire come distinguerli. Ad esempio, un oggetto che ha il "puntatore di funzione" E qualcosa per indicare l'ambito - se lo definisci, sai dove ti trovi.

I.e. myEvaluator.scope dirà informazioni su dove è stato captuerd l'ambito di valutazione, e myEvaluator.eval potrebbe essere utilizzato per valutare.