var foo = "hello"; var c = (função a () {função b () {var bar = "world"; alert (foo + bar); barra de retorno;} retornar b;}) (); alerta (foo + c);Este exemplo aparece Hello World duas vezes;
1. O que é um fechamento?
A explicação "oficial" é: o chamado "fechamento" refere-se a uma expressão (geralmente uma função) que possui muitas variáveis e um ambiente ligado a essas variáveis; portanto, essas variáveis também fazem parte da expressão.
Acredito que poucas pessoas podem entender diretamente essa frase porque ele a descreveu muito academicamente. Quero usar como criar um fechamento no JavaScript para dizer o que é um fechamento, porque é muito difícil entender diretamente a definição de um fechamento pulando o processo de criação de fechamento. Veja o seguinte código:
função a () {var i = 0; função b () {alert (++ i);} retornar b;} var c = a (); c ();Este código tem duas características:
1. A função b é aninhada na função interna a;
2. Função A Retorna a função b.
Dessa forma, depois de executar var c = a (), a variável C realmente aponta para a função b. Depois de executar C (), uma janela será exibida para exibir o valor de I (a primeira vez é 1). Este código realmente cria um fechamento. Por que? Porque a variável C Externa função A refere -se à função B na função A, ou seja,:
Quando a função interna B da função A é referenciada por uma função externa variável A, um fechamento é criado.
Acho que você ainda não entende o fechamento porque não sabe o que os fechamentos têm. Vamos continuar a explorar abaixo.
2. Qual é a função dos fechamentos?
Em resumo, a função de um fechamento é que, após a execução e devolvida, o fechamento faz com que o mecanismo de coleta de lixo JavaScript GC não recupere os recursos ocupados por A, porque a execução de uma função interna B de A precisa de confiar nas variáveis em a. Esta é uma descrição muito direta do papel dos fechamentos, que não é profissional ou rigoroso, mas significa aproximadamente que é. A compreensão do fechamento requer um processo gradual.
No exemplo acima, depois que a função A é retornada, eu sempre existe, então toda vez que C () é executado, eu é o valor de alertar depois de adicionar 1.
Então vamos imaginar outra situação. Se um retorno não funcionar B, a situação é completamente diferente. Como depois que A é executado, B não é devolvido ao mundo exterior de A, mas é referenciado apenas por A e, neste momento, A será referenciado apenas por B, de modo que as funções A e B são referenciadas entre si, mas não serão perturbadas pelo mundo exterior (referido pelo mundo exterior), as funções A e B serão recicladas pelo GC. (O mecanismo de coleta de lixo de JavaScript será introduzido em detalhes posteriormente)
3. O mundo microscópico no fechamento
Se queremos ter uma compreensão mais profunda da relação entre os fechamentos e a função A e a função aninhada B, precisamos introduzir vários outros conceitos: o ambiente de execução da função (contexto de excitação), o objeto ativo (objeto de chamada), o escopo (escopo) e a cadeia de escopo. Veja o processo de função A da definição para a execução como exemplo para ilustrar esses conceitos.
1. Ao definir a função A, o intérprete JS definirá a cadeia de escopo da função A como o "ambiente", onde a está localizado ao definir a. Se A é uma função global, existem apenas objetos de janela na cadeia de escopo.
2. Quando a função A é executada, a entra no ambiente de execução correspondente (contexto de excitação).
3. No processo de criação de um ambiente de execução, um atributo de escopo, ou seja, o escopo de A e seu valor é a cadeia de escopo na etapa 1. Ou seja, a cadeia de escopo de A.Scope = a.
4. O ambiente de execução criará um objeto ativo (objeto de chamada). O objeto ativo também é um objeto com atributos, mas não possui um protótipo e não pode ser acessado diretamente através do código JavaScript. Depois de criar o objeto ativo, adicione o objeto ativo à parte superior da cadeia de escopo de a. Neste momento, a cadeia de escopo de A contém dois objetos: o objeto ativo de A e o objeto da janela.
5. A próxima etapa é adicionar um atributo de argumentos ao objeto ativo, que salva os parâmetros passados quando chama a função a.
6. Finalmente, adicione todos os parâmetros formais da função A e as referências à função interna B ao objeto ativo de a. Nesta etapa, a definição da função B é concluída; portanto, na etapa 3, a cadeia de escopo da função B é definida como o ambiente definido por B, ou seja, o escopo de a.
Neste ponto, toda a função A é concluída da definição para a execução. Nesse momento, a retorna uma referência à função B ao C, e a cadeia de escopo da função B contém uma referência ao objeto ativo da função A, ou seja, B pode acessar todas as variáveis e funções definidas em a. A função B é referenciada por C e a função B depende da função A, portanto, a função A não será reciclada pelo GC após a devolução.
Quando a função B é executada, também será a mesma que acima. Portanto, a cadeia de escopo de B durante a execução contém 3 objetos: o objeto ativo de B, o objeto ativo de A e o objeto da janela, como mostrado na figura abaixo:
Conforme mostrado na figura, ao acessar uma variável na função B, a ordem de pesquisa é primeiro pesquisar seu próprio objeto ativo e, se existir, ele retornará. Se não existir, continuará pesquisando o objeto ativo da função A e pesquise por sua vez até que seja encontrado. Se não puder ser encontrado em toda a corrente do escopo, indefinido será devolvido. Se houver um protótipo de protótipo Objeto da Função B, depois de pesquisar seu próprio objeto ativo, procure primeiro seu próprio objeto de protótipo e continue pesquisando. Este é o mecanismo de pesquisa variável no JavaScript.
4. Cenários de aplicação de fechamentos
1. Proteja a segurança das variáveis na função. Tomando o primeiro exemplo como exemplo, na função A, só posso ser acessado pela função B, mas não posso ser acessado por outros canais, protegendo assim a segurança de i.
2. Mantenha uma variável na memória. Ainda assim, devido ao fechamento, eu, em função, sempre existe na memória; portanto, toda vez que C () for executado, serei adicionado 1.
Os dois pontos acima são os cenários de aplicação mais básicos para fechamentos, e muitos casos clássicos se originam disso.
5. Mecanismo de coleta de lixo do JavaScript
No JavaScript, se um objeto não for mais referenciado, o objeto será reciclado pelo GC. Se dois objetos forem referenciados entre si e não forem mais referenciados pela terceira pessoa, os dois objetos referenciados entre si serão reciclados. Como a função A é referenciada por B, B é referenciado por C fora de A, e é por isso que a função A não será reciclada após a execução.
O artigo acima entende de forma abrangente que o mecanismo de fechamento é todo o conteúdo que compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.