O JavaScript inclui conceitos como escopo (escopo), cadeia de escopo (cadeia de escopo), contexto de execução (contexto de execução), objeto ativo (objeto ativo), escopo dinâmico (escopo dinâmico) e fechamento (fechamento). Para entender esses conceitos, analisamos -os de aspectos estáticos e dinâmicos.
Primeiro, vamos escrever uma função simples para fazer um exemplo:
A cópia do código é a seguinte:
função add (num1, num2) {
var sum = num1 + num2;
soma de retorno;
}
Definimos uma função Adicionar com dois parâmetros formais.
Aspectos estáticos:
Ao criar uma função ADD, o mecanismo JavaScript criará uma cadeia de escopo da função Add, e essa cadeia de escopo aponta para o contexto global. Se você usa representações gráficas, a figura a seguir será mostrada:
Como pode ser visto na figura acima, quando a função Adicionar é criada, a cadeia de escopo foi criada, para que possamos tirar uma conclusão de que a cadeia de escopo da função é criada quando a função é criada, em vez de um período dinâmico de execução. Vamos dar uma olhada no que acontece durante a execução dinâmica.
Aspectos dinâmicos:
Ao executar a função Adicionar, o JavaScript criará um contexto de execução, que contém todas as informações necessárias durante o tempo de execução da função Adicionar. O contexto de execução também tem sua própria cadeia de escopo. Quando a função estiver em execução, o mecanismo JavaScript inicializará primeiro a cadeia de escopo do contexto de execução da cadeia de escopo da função Adicionar e, em seguida, o mecanismo JavaScript criará um objeto ativo, que contém todas as variáveis locais, parâmetros e esta e outras variáveis durante o tempo de execução da função.
Se a imagem for descrita, o que acontece durante o tempo de execução dinâmico da função Add, ela pode ser descrita na figura a seguir:
Como pode ser visto na figura acima, o contexto de execução é um conceito dinâmico. É criado quando a função está em execução. Ao mesmo tempo, o objeto ativo também é um conceito dinâmico. É referenciado pela cadeia de escopo do contexto de execução. Portanto, pode -se concluir que tanto o contexto de execução quanto o objeto ativo são conceitos dinâmicos, e a cadeia de escopo do contexto de execução é inicializada pela cadeia de escopo da função.
O acima fala sobre o escopo do escopo da função e do contexto de execução. Vamos falar sobre o problema do escopo dinâmico. Quando o JavaScript passa com declarações, cláusulas de captura de tentativa e métodos de avaliação, o mecanismo JavaScript mudará dinamicamente o escopo do contexto de execução. Vamos dar uma olhada nisso com um exemplo:
A cópia do código é a seguinte:
função initui () {
com (documento) {// evite!
var bd = corpo,
links = getElementsByTagName ("a"),
i = 0,
len = links.length;
enquanto (i <len) {
atualização (links [i ++]);
}
getElementById ("Go-btn"). OnClick = function () {
começar();
};
bd.className = "ativo";
}
Ao executar a função Initui acima, o JavaScript criará dinamicamente um escopo correspondente correspondente à instrução com com e o colocará na extremidade frontal da cadeia de escopo do contexto de execução. O processo acima pode ser descrito vividamente através da figura abaixo. A área marcada em vermelho abaixo mostra o escopo gerado pela declaração com com.
Por fim, vamos dar uma olhada no fechamento mais misterioso do JavaScript. Os fechamentos são na verdade uma função no JavaScript. O fechamento é criado durante o tempo de execução da função. Vamos dar um exemplo para ver:
A cópia do código é a seguinte:
function cacktionEvents () {
var id = "xdi9592";
document.getElementById ("salv-btn"). OnClick = function (event) {
Savedocument (id);
};
}
Quando a função do cacktionEvents acima for executada, um fechamento será criado e esse fechamento se referirá à variável de identificação no escopo dos CessionEvents. Se, de acordo com a linguagem de programação tradicional, o ID for uma variável armazenada na pilha. Quando a função é executada, o ID desaparece, então como pode ser referenciado novamente? Obviamente, o JavaScript adota outra maneira aqui. Vamos dar uma olhada em como o JavaScript implementa o fechamento. Ao executar a função CessionEvents, o mecanismo JavaScript criará uma cadeia de escopo do contexto de execução da função CessionEvents. Essa cadeia de escopo contém os objetos ativos quando o CessionEvents é executado. Ao mesmo tempo, o mecanismo JavaScript também criará um fechamento, e a cadeia de escopo do fechamento também se referirá aos objetos ativos quando os CessionEvents forem executados. Dessa maneira, quando o CessionEvents é executado, embora a cadeia de escopo de seu próprio contexto de execução não se refere mais aos objetos ativos, o fechamento ainda se refere aos objetos ativos correspondentes ao tempo de execução do CingningEvents, o que explica o mecanismo de fechamento dentro do JavaScript. Você pode usar a figura a seguir para descrever a situação do tempo de execução da função do cenário acima:
Como pode ser visto no exposto, após a execução da função do cessionEvents, document.getElementById ("salv-btn"). OnClick refere-se ao fechamento. Dessa forma, quando o usuário clicar em Salvar-BTN, a execução do fechamento será acionada. Vamos dar uma olhada na situação quando o fechamento for executado. Como mencionado anteriormente, os fechamentos em JavaScript são realmente funções, portanto, as situações de execução de fechamento e execução da função são consistentes. A figura a seguir descreverá vividamente o fechamento associado ao evento OnClick acima.
A partir da figura acima, podemos ver que o mecanismo JavaScript primeiro cria o contexto de execução do fechamento, depois usa a cadeia de escopo de fechamento para inicializar a cadeia de escopo do contexto de execução do fechamento e, finalmente, coloca o objeto ativo correspondente quando o fechamento é executado na extremidade frontal do escopo, que verifica adicionar o fechamento é uma função.