¿Qué es un “contexto de llamada”?
-
23-12-2019 - |
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:
- 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?
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í quemyFrame.setTimeout(eval, 0, "alert(x)");
Debería mostrar
myFrame.x
, no el marco de llamada o la ventanax
.
Nota: myFrame
en este caso se refiere al alcance global del marco.