Compreenda o processamento de scripts pelo mecanismo javascript no ambiente de host do navegador

# Modelo de processamento de script

## Recursos básicos de JavaScript

1. js é uma linguagem de interpretação de tempo de execução bastante simples.
2. O modelo de objeto é muito direto e não tem conceito de classes (ES5).
3. Há coleta de lixo automática.
4. Tipos de dados fracos.
5. Tipagem dinâmica: O tipo do objeto é determinado em tempo de execução.
6. JavaScript não tem nenhum mecanismo de E / S embutido.


Extensão: a interação entre o programa javascript e o ambiente host é obtida por meio de uma série de métodos e atributos predefinidos. Esses métodos e atributos serão mapeados no código nativo interno do navegador, por isso é diferente de outras linguagens de programação convencionais. Essas desculpas para a abertura de dispositivos muitas vezes são limitados e direcionados.

## Modelo de processamento de script

Em primeiro lugar, seja uma janela independente ou em um quadro, cada documento html exibido no navegador é atribuído a uma instância de ambiente de execução javascript independente, e todas as variáveis ​​globais e funções do script carregado neste ambiente são de propriedade de Um namespace independente .

Em seguida, todos os scripts do mesmo documento são executados no mesmo ambiente de execução, compartilham a mesma sandbox e podem interagir com outros contextos por meio da API fornecida pelo navegador.

Finalmente: em um contexto de execução específico, cada bloco de código javascript é processado à sua maneira, e a ordem é basicamente determinada. Cada bloco de código é composto por várias unidades independentes de acordo com o formato gramatical.O processo de processamento inclui três etapas claras e contínuas: processamento do código-fonte, análise da função e execução do código.


## Processamento do código fonte

No estágio de processamento do código-fonte, a sintaxe no bloco de código do script é verificada e o código geralmente é primeiro convertido em uma imagem binária na camada intermediária, para que uma velocidade de execução satisfatória possa ser obtida. Até que essa etapa seja completamente concluída, esses códigos binários não têm efeito na situação geral. Se ocorrer um erro no estágio de processamento do código-fonte, todo o bloco de código problemático será descartado; em seguida, o analisador continuará a processar o próximo bloco de código.

## Análise de função

Depois de concluir a etapa anterior, a próxima etapa é para o analisador identificar e registrar todas as funções globais nomeadas no bloco de código atual. Após a conclusão dessa etapa, essas funções podem ser chamadas pelo código em execução.

Para o código

`` `html
<script>
hello_world ();

função hello_world () {     console.log ('hello, man'); } </script> `` `



Como o javascript será adicionalmente pré-processado antes da execução, a escrita acima será executada com sucesso.

E para o código

`` `html
<script>
hello_world ();
</script>


função <script> hello_world () {     console.log ('hello, man'); } </script> `` `



Para este código, a execução falhará devido a um erro durante o tempo de execução, porque cada bloco de código independente no código não é processado ao mesmo tempo, o que é determinado pela ordem em que o mecanismo javascript lê o bloco de código. Quando o primeiro bloco de código é executado, o bloco de código que define hello_world () ainda não foi analisado.

Olhe para o código novamente

`` `html
<script>
hello_world ();

var hello_world = function () {     console.log ('hello, men'); } </script> `` `



 

A razão para este fenômeno é que a atribuição da variável hello_world ainda não começou quando hello_world () é chamada!

Explicação: O modelo de resolução de nome global de javascript é válido apenas para funções, mas não para declarações de variáveis. Semelhante a outras linguagens de script, as variáveis ​​são registradas na ordem em que aparecem durante a execução.

## Execução de código

Assim que a fase de análise da função for concluída, o mecanismo javascript começará a executar todo o código fora do bloco de funções em sequência. Se durante o processo de execução, devido a algumas exceções não tratadas ou alguns motivos parciais, a execução do script pode falhar. Se você encontrar este erro, as funções que foram resolvidas corretamente ainda podem ser chamadas e o resultado do código que foi executado ainda é válido para este contexto.

`` `html
<script>
function no_called () {   console.log ('Esta função não será executada porque não foi chamada!'); }

function hello_world () {   console.log ('Esta função só será executada quando for chamada. O efeito é que esta frase aparece na linha de comando, e então uma exceção é lançada: porque uma função que não pode ser resolvida é chamada' );   do_stuff (); }


console.log ('Todo o programa será executado a partir desta linha de código!');

Olá Mundo();

console.log ('Esta linha de código não será executada, porque hello_world () irá disparar uma exceção não tratada.');
</script>

<script>
  console.log ('A exceção anterior não afetará o código deste bloco independente, então ele pode ser executado.')
</script>

`` `

 

A partir disso, podemos ver: devido a algumas condições anormais inesperadas e não tratadas, o funcionamento do programa trará algumas consequências inesperadas: neste momento, o estado de toda a aplicação ficará menos uniforme, de fato, mesmo que haja um exceção, o código ainda pode continuar a executar.

Acho que você gosta

Origin blog.csdn.net/wancheng815926/article/details/83313801
Recomendado
Clasificación