Pregunta

ECMA-262 5.1 subsecciones 10.4.2 y 10.4.2.1 Consulte un "contexto de llamada". Esto no parece ser descrito en ningún otro lugar del documento.

Citando la especificación, el énfasis es mío:

10.4.2 Ingresando el código de evaluación

Los siguientes pasos se realizan cuando el control ingresa al contexto de ejecución para el código de evaluación:

  1. Si no hay contexto de llamada o si el código de evaluación no se evalúa mediante una llamada directa (15.1.2.1.1) a la función de evaluación, entonces,

10.4.2.1 Restricciones del modo estricto

El código de evaluación no puede crear instancias de enlaces de variables o funciones en el entorno variable del contexto de llamada que invocó la evaluación si el código del contexto de llamada o el código de evaluación es un código estricto.En lugar de ello, se crean instancias de dichos enlaces en un nuevo entorno variable al que solo puede acceder el código de evaluación.

  • ¿Qué significa "llamar al contexto" en estos párrafos?Supongo que se refiere a la Contexto de ejecución en la parte superior de la pila justo antes eval se llama;¿Alguien puede verificar esto?

  • ¿Qué significa tener "sin contexto de llamadas"? ¿Alguien puede proporcionar un ejemplo de código o condiciones que pueda dar lugar a una llamada a eval sin contexto de llamada?

¿Fue útil?

Solución

El "contexto de llamada" se refiere al contexto en el que el nativo eval se llama a la función.

Si estas ejecutando eval desde algún código nativo (por ejemplo, ejecuta una función nativa que ejecuta el código cuando se completa usando eval por alguna razón u otra), entonces no tendría contexto, que luego se especifica para ejecutarse bajo el alcance global.El contexto solo se refiere al código ejecutable ECMAScript.

Sin embargo, el contexto de llamada se refiere a las variables y directivas en el contexto de ejecución donde se llama.Por ejemplo, solo sabe que eval debe funcionar como código estricto si verifica el contexto de llamada.

Esto se aclara con una pregunta muy similar en la lista de correo de ES-Discuss, donde Brendan Eich (el creador de JavaScript) responde:

¿Cómo es posible que el código de evaluación no tenga un contexto de llamada?

ES3 dice:

10.2.2 Código de evaluación

Cuando el control ingresa un contexto de ejecución para el código EVAL, el contexto de ejecución activa anterior, denominado contexto de llamadas, se usa para determinar la cadena de alcance, el objeto variable y este valor.Si no hay un contexto de llamada, entonces inicializar la cadena de alcance, la instanciación variable y la determinación de este valor se realizan al igual que el código global.

Estoy desconcertado por "Si no hay un contexto de llamada".¿Cómo podría surgir la posibilidad?Cómo podría eval ¿Te llaman si nadie lo llama?

Respuesta:

Una llamada desde código nativo, el programa "host".

Algunos navegadores admiten indirecta. eval, permitiendo esto:

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

La ventana utilizada es aquella en la que setTimeout fue encontrado a lo largo de la cadena de alcance, así que

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

Debería mostrar myFrame.x, no el marco de llamada o la ventana x.

Nota: myFrame en este caso se refiere al alcance global del marco.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top