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:

  1. 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?

Foi útil?

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 janela x.

Nota: myFrame neste exemplo refere-se ao quadro do escopo global.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top