Qu'est ce qu'un “appel le contexte?”
-
23-12-2019 - |
Question
ECMA-262 paragraphes 5.1 10.4.2 et 10.4.2.1 se référer à un "appel le contexte." Ce ne semble pas être décrits ailleurs dans le document.
Citant le spec, c'est moi qui souligne:
10.4.2 Entrer Eval Code
Les étapes suivantes sont effectuées lorsque le contrôle pénètre dans le contexte d'exécution de la fonction eval code:
- Si il n'y a pas de l'appel de contexte ou si l'eval code n'est pas en cours d'évaluation par un appel direct (15.1.2.1.1) à la fonction eval puis,
10.4.2.1 Strictes Restrictions Du Mode D'
L'eval de code ne peut pas instancier la variable ou de la fonction des liaisons dans la variable d'environnement de la l'appel de contexte qui a appelé le eval si le code de la l'appel de contexte ou l'eval code est un code strict.Au lieu de cela ces liaisons sont instanciés dans un nouveau VariableEnvironment qui n'est accessible que pour les eval code.
Ce n' "appel le contexte" dans ces paragraphes?Je suppose qu'il fait référence à la Contexte D'Exécution en haut de la pile juste avant
eval
est appelé;quelqu'un peut-il vérifier?Que signifie le fait de n'avoir "pas d'appel dans le contexte?" Quelqu'un peut-il fournir un exemple de code ou les conditions qui pourraient entraîner un appel à
eval
sans appel le contexte?
La solution
L ' "appel le contexte" fait référence au contexte qui le natif eval
la fonction est appelée à partir d'.
Si vous sont en cours d'exécution eval
à partir du code natif (par exemple, vous exécutez une fonction native qui exécute le code une fois rempli à l'aide de eval
pour une raison ou une autre), alors il n'aurait pas de contexte, qui est alors précisé à exécuter en vertu de la portée globale.Le contexte se réfère uniquement à la ECMAScript code exécutable.
Cependant, le contexte de l'appel se réfère aux variables et les directives dans le contexte d'exécution de l'endroit où il est appelé.Par exemple, on sait seulement que la fonction eval est destinée à travailler en tant que code de conduite très strict si elle vérifie le contexte de l'appel.
Cette disposition est précisée par une question très semblable dans l'ES-Discuter de la liste de diffusion, où Brendan Eich (le créateur de JavaScript) répond:
Comment peut-eval code ont pas une vocation contexte?
ES3 dit:
10.2.2 Eval Code
Lorsque le contrôle pénètre dans un contexte d'exécution pour eval code, l'actif précédent le contexte d'exécution, appelé le l'appel de contexte, est utilisé pour déterminer l'étendue de la chaîne, la variable l'objet et la valeur de this.Si il n'y a pas d'appel de contexte, alors initialisation de la chaîne d'étendue variable, l'instanciation, et la détermination de cette valeur sont effectuées tout comme pour le code mondial.
Je suis déçu par "Si il n'y a aucun appel de contexte".Comment pourrait-on le possibilité surviennent?Comment
eval
me demande si on ne l'appelle?
Réponse:
Un appel à partir du code natif, le "host" du programme.
Certains navigateurs prennent en charge indirecte
eval
, ce qui lui permet:setTimeout(eval, 0, "alert('hi mom')");
La fenêtre utilisée est celle dans laquelle
setTimeout
a été trouvé le long de la la portée de la chaîne, de sortemyFrame.setTimeout(eval, 0, "alert(x)");
devrait montrer
myFrame.x
, pas l'appel de la fenêtre de l'x
.
Note: myFrame
dans cet exemple se rapporte à l'image de portée mondiale.