Domanda

ECMA-262 5.1 sottosezioni 10.4.2 E 10.4.2.1 Fare riferimento a un "contesto di chiamata". Questo non sembra essere descritto da nessun'altra parte del documento.

Citando le specifiche, sottolineo il mio:

10.4.2 Immissione del codice di valutazione

I seguenti passaggi vengono eseguiti quando il controllo entra nel contesto di esecuzione per il codice eval:

  1. Se non c'è contesto di chiamata o se il codice eval non viene valutato da una chiamata diretta (15.1.2.1.1) alla funzione eval allora,

10.4.2.1 Restrizioni sulla modalità rigorosa

Il codice eval non può istanziare associazioni di variabili o funzioni nell'ambiente variabile del file contesto di chiamata che ha invocato l'eval se il codice di contesto di chiamata oppure il codice di valutazione è un codice rigoroso.Invece tali associazioni vengono istanziate in un nuovo VariableEnvironment che è accessibile solo al codice eval.

  • Cosa significa "contesto di chiamata" in questi paragrafi?Presumo che si riferisca a Contesto di esecuzione in cima alla pila poco prima eval è chiamato;qualcuno può verificarlo?

  • Cosa significa avere "nessun contesto di chiamata?" Qualcuno può fornire un esempio di codice o condizioni che potrebbero comportare una chiamata a eval senza contesto di chiamata?

È stato utile?

Soluzione

Il "contesto di chiamata" si riferisce al contesto in cui è nativo eval la funzione viene chiamata da.

Se stai eseguendo eval da codice nativo (ad esempio, esegui una funzione nativa che esegue il codice una volta completata utilizzando eval per un motivo o per l'altro), non avrebbe contesto, che viene quindi specificato per essere eseguito nell'ambito globale.Il contesto si riferisce solo al codice eseguibile ECMAScript.

Tuttavia, il contesto chiamante fa riferimento alle variabili e alle direttive nel contesto di esecuzione in cui viene chiamato.Ad esempio, sa che eval è pensato per funzionare come codice rigoroso solo se controlla il contesto chiamante.

Ciò è chiarito da una domanda molto simile nella mailing list ES-Discuss, dove Brendan Eich (il creatore di JavaScript) risponde:

Come può il codice eval non avere un contesto di chiamata?

ES3 dice:

10.2.2 Codice di valutazione

Quando il controllo inserisce un contesto di esecuzione per il codice Eval, il precedente contesto di esecuzione attiva, indicato come contesto di chiamata, viene utilizzato per determinare la catena dell'ambito, l'oggetto variabile e il presente valore.Se non esiste un contesto di chiamata, inizializza la catena di portata, l'istanziazione variabile e la determinazione di questo valore vengono eseguite proprio come per il codice globale.

Sono sconcertato da "Se non esiste un contesto di chiamata".Come potrebbe sorgere la possibilità?Come sarebbe eval vieni chiamato se nessuno lo chiama?

Risposta:

Una chiamata dal codice nativo, il programma "host".

Alcuni browser supportano l'indiretto eval, consentendo ciò:

setTimeout(eval, 0, "alert('hi mom')");

La finestra utilizzata è quella in cui setTimeout è stato trovato lungo la catena dell'ambito, quindi

myFrame.setTimeout(eval, 0, "alert(x)");

dovrebbe mostrare myFrame.x, non il frame o la finestra chiamante x.

Nota: myFrame in questo caso si riferisce all'ambito globale del frame.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top