Primeiro, vejamos um pedaço de código:
A cópia do código é a seguinte:
<a href = "javascript: void (0);"> 111 </a>
<a href = "javascript: void (0);"> 222 </a>
<a href = "javacsript: void (0);"> 333 </a>
var a = document.getElementsByTagName ("A");
função b () {
for (var i = 0; i <A.Length; i ++) {
a [i] .OnClick = function () {
alerta (i);
}
}
}
De acordo com nossa intenção original de design, deve ser clicar em uma tag A para exibir o número de série correspondente da tag, ou seja, clique no primeiro A para aparecer 0 e clicar no segundo para aparecer 1 ... mas o fato é que o número de tags que um pop -up sempre é sempre o número de tags a. Qual é o motivo? Esse problema me incomodou há muito tempo. Consultei muitos materiais on -line e livros de referência. A maioria deles é plausível. Acredito que muitos estudantes não sabem muito sobre os motivos. Vou falar sobre minha compreensão dessa questão. Se houver alguma inadequação, critique e me corrija.
No meu entendimento pessoal, a razão pela qual a função acima falhou em alcançar seu objetivo é que a função de processamento de eventos ligue a variável i e a função de processamento de eventos é atribuída ao OnClick, ou seja, a função será chamada apenas quando a tag A for clicada. Portanto, logicamente falando, o function () {alert (i);} em um loop simples para o loop não é realmente executado e, quando clicamos na tag A, o loop for já foi executado. Neste momento, o valor de I é o valor final da execução do loop. Para ser simples, o valor de I pertence à função B, e o valor de I precisamos é o valor passado para a função de processamento de eventos em tempo real. Então, existe alguma maneira de realizar nossa intenção de design original? Um colega de classe inteligente pode ter adivinhado que é usar fechamentos.
Vejamos outro código:
A cópia do código é a seguinte:
var a = document.getElementsByTagName ("A");
função b () {
for (var i = 0; i <A.Length; i ++) {
a [i] .OnClick = function (j) {
Return function () {
alerta (j);
}
}(eu);
}
}
b ();
Execute o código acima e você descobrirá que a função que queremos foi implementada, ou seja, clicando em qualquer tag a exibirá o número de série em que a tag está localizada. Acredito que muitos estudantes viram muitas versões semelhantes do código acima, mas por que podemos alcançar as funções de que precisamos fazendo isso? Esta é minha opinião pessoal. Se houver alguma inadequação, dê -me alguns conselhos.
A essência do entendimento do código acima é o entendimento da variável i. Neste código, quando a função é executada e o loop for encontrado, uma função de chamada imediata é encontrada. Neste momento, o valor variável em tempo real I é passado para a função de chamada imediata. A função é chamada imediatamente e a função de processamento de eventos armazena o valor da variável I em tempo real.
O acima é tudo sobre este artigo. Espero que seja útil para a compreensão de todos sobre o fechamento de JS.