O que é um fechamento?
Vejamos primeiro um pedaço de código:
função a () {var n = 0; function inc () {n ++; console.log (n); } inc (); Inc (); }um(); // saídas do console 1, depois sai 2É simples. Vejamos outro pedaço de código:
função a () {var n = 0; this.inc = function () {n ++; console.log (n); };} var c = novo a (); c.inc (); // saída de console 1c.inc (); // Saída do console 2É simples.
O que é um fechamento? Este é o fechamento!
As funções que têm acesso a variáveis dentro do escopo de outra função são fechamentos. Aqui, a função INC acessa a variável n no construtor A, então um fechamento é formado.
Vejamos outro pedaço de código:
função a () {var n = 0; function inc () {n ++; console.log (n); } retornar inc;} var c = a (); c (); // saída de console 1c (); // Saída do console 2Vamos ver como é executado:
var c = couter (), esta frase couter () retorna a função inc, então essa frase é equivalente a var c = inc;
c (), esta frase é equivalente a inc (); Observe que o nome da função é apenas um identificador (um ponteiro para uma função) e () é a função de execução.
As próximas três frases traduzidas para: var c = inc; Inc (); Inc ();, existe alguma diferença entre ele e a primeira peça de código? Não.
O que é um fechamento? Este é o fechamento!
Todos os tutoriais de livros didáticos gostam de usar o último parágrafo para ilustrar o fechamento, mas acho que isso complica o problema. O que é retornado aqui é o nome da função. Os alunos que nunca viram a programação C/C ++ de Tan Haoqiang podem não refletir imediatamente a diferença entre trazer () ou não, o que significa que este método de escrita vem com uma armadilha. Embora este método de escrita seja mais proeminente, eu ainda gosto de singularizar o problema e olhar para o Código 1 e o Código 2. Você ainda ficará confuso sobre a chamada de função, ficará confuso sobre o valor de n?
Por que você precisa escrever assim?
Sabemos que cada função do JS é uma pequena sala preta. Ele pode obter informações externas, mas o mundo exterior não pode ver diretamente o conteúdo dentro. Colocando a variável n em uma pequena sala escura, exceto a função INC, não há outra maneira de entrar em contato com a variável n. Além disso, definir a variável n com o mesmo nome fora da função A não se afeta. Este é o chamado aprimoramento de "encapsulamento".
O motivo pelo qual você precisa usar a função de retorno para retornar para identificar o INC é porque a função INC não pode ser chamada diretamente fora da função A, portanto, o retorno inc está associado ao exterior. Isso no Código 2 também associa apenas a INC à parte externa.
Armadilhas comuns
Confira isso:
função createfunctions () {var resultado = new Array (); for (var i = 0; i <10; i ++) {resultado [i] = function () {return i; }; } return resultado;} var funcs = createfunctions (); for (var i = 0; i <funcs.length; i ++) {console.log (funcs [i] ());}À primeira vista, pensei que estava emitindo 0 ~ 9, mas nunca esperava que ele produzisse 10 10?
A armadilha aqui é: a função com () é a função de execução! Uma frase simples var f = function () {alert ('hi'); }; não aparecerá e a seguinte frase f (); Executará o código dentro da função. O código acima é traduzido como:
var resultado = new Array (), i; resultado [0] = function () {return i; }; // A função não é executada, a função permanece inalterada e o I na função não pode ser substituído! resultado [1] = function () {return i; }; // A função não é executada, a função permanece inalterada e o I na função não pode ser substituído! ... resultado [9] = function () {return i; }; // A função não é executada, a função permanece inalterada e o I na função não pode ser substituído! i = 10; funcs = resultado; resultado = null; console.log (i); // funcs [0] () deve executar a declaração de retorno I, que é retornar 10console.log (i); // funcs [1] () deve executar a declaração de retorno I, que é retornar 10 ... console.log (i); // Funcs [9] () deve executar a declaração de retorno I, que é retornar 10Por que apenas resultados de coleta de lixo, mas não eu? Porque eu ainda estou sendo referenciado por função. É como um restaurante onde as placas são sempre limitadas, então o garçom irá para patrulhar Taiwan para reciclar pratos vazios, mas como se atreve a coletar os pratos que ainda contêm vegetais? Obviamente, se você derramar manualmente os pratos (= nulo) no prato, o prato será retirado. Este é o chamado mecanismo de reciclagem de memória.
Quanto à forma como o valor de eu ainda posso ser mantido, de fato, lê -lo desde o início do artigo não deve ser nada com que se preocupar. Não é necessário comer um pedaço do prato no prato para perder uma peça?
Vamos resumir
Um fechamento é uma variável de que uma função se refere a outra função. Como a variável é referenciada, ela não será reciclada e pode ser usada para encapsular uma variável privada. Esta é uma vantagem e uma desvantagem. O fechamento desnecessário aumentará apenas o consumo de memória! Além disso, ao usar o fechamento, você também deve prestar atenção se o valor da variável atende aos seus requisitos, porque é como uma variável privada estática. Os fechamentos geralmente são misturados com muitas coisas e somente depois de contatá -las com mais entendimento, podemos aprofundar nosso entendimento. Aqui estamos apenas falando sobre coisas básicas.
Link para este artigo: http://www.cnblogs.com/qieguo/p/5457040.html
O exposto acima é tudo sobre este artigo, espero que seja útil para o aprendizado de todos.