O que é um "contexto de chamada?"
-
23-12-2019 - |
Pergunta
ECMA-262 5.1 subseções 10.4.2 e 10.4.2.1 referem-se a um "contexto de chamada." Este não parece ser descrito em qualquer parte do documento.
Citando a especificação, ênfase minha:
10.4.2 Entrar Eval Código
As seguintes etapas são executadas quando o controle entra o contexto de execução para eval código:
- Se não há contexto de chamada ou se o eval de código não está a ser avaliado por uma chamada direta (15.1.2.1.1) para a função eval em seguida,
10.4.2.1 De Modo Estrito Restrições
O eval de código não é possível instanciar a variável ou função de ligações na variável de ambiente do contexto de chamada que invocou o eval se o código do contexto de chamada ou eval código é código estrito.Em vez disso, tais ligações são instanciados em um novo VariableEnvironment que só é acessível para o eval de código.
O que significa "chamar de contexto" significa que nestes pontos?Eu diria que se refere o Contexto De Execução no topo da pilha antes
eval
é chamado;alguém pode confirmar isso?O que significa ter "nenhum contexto de chamada?" Alguém pode dar um exemplo de código ou condições que podem resultar em uma chamada para
eval
sem chamar contexto?
Solução
O "contexto de chamada" refere-se ao contexto que o nativo eval
a função está sendo chamado.
Se você está executando eval
a partir de alguns de código nativo (por exemplo, você executar uma função nativa que executa o código quando concluído, utilizando eval
por algum motivo ou outro), então ele não teria nenhuma contexto, que é especificado para ser executado sob o escopo global.O contexto refere-se apenas à ECMAScript código executável.
No entanto, o contexto de chamada refere-se às variáveis e directivas no contexto de execução de onde é chamada.Por exemplo, ele só sabe que eval destina-se a funcionar como um estrito código se verifica com o contexto de chamada.
Este é esclarecida por uma pergunta semelhante no ES-Discutir lista de discussão, onde Brendan Eich (o criador do JavaScript) responde:
Como pode eval código não tem um contexto de chamada?
ES3 diz:
10.2.2 Eval Código
Quando o controle entra em um contexto de execução para eval código anterior active contexto de execução, referida como a contexto de chamada, é utilizado para determinar o escopo da cadeia, a variável objeto, e a esse valor.Se não há contexto de chamada e, em seguida, inicializando o escopo da cadeia, variável de instância, e a determinação deste valor são realizadas apenas para o código global.
Estou perplexo com o "Se não existir nenhuma chamada de contexto".Como poderia o possibilidade de surgir?Como seria
eval
chamado a se ninguém chama ele?
Resposta:
Uma chamada a partir do código nativo, o "host" do programa.
Alguns navegadores oferecem suporte indireto
eval
, permitindo a este:setTimeout(eval, 0, "alert('hi mom')");
A janela usada é aquela em que
setTimeout
foi encontrado junto a âmbito de aplicação corrente, portanto,myFrame.setTimeout(eval, 0, "alert(x)");
deve mostrar
myFrame.x
, não o quadro de chamada ou da janelax
.
Nota: myFrame
neste exemplo refere-se ao quadro do escopo global.