Os fechamentos em JavaScript são realmente uma pergunta clichê. Recentemente, tenho perguntado sobre minhas próprias habilidades de expressão e não posso apoiá -las totalmente. Eu sou louco. No caminho de volta, de repente pensei em uma coisa muito simples. De fato, quando estamos realizando projetos, geralmente usamos o fechamento, mas quando fazemos perguntas, as respostas geralmente são as respostas que frequentemente encontramos. Infelizmente, se estamos lidando com entrevistas ou realmente querendo aprender algo, compartilharei com você meu próprio entendimento, e escrever é inevitável.
1. Qual é um fechamento?
O livro de Red Bao diz: "Refere -se a uma função que tem o direito de acessar variáveis em outro escopo de função".
Simplificando, o JavaScript permite o uso de funções internas - ou seja, as definições de função e as expressões de função estão localizadas no corpo de função de outra função. Além disso, essas funções internas podem acessar todas as variáveis locais, parâmetros e outras funções internas declaradas na função externa onde residem. Quando uma dessas funções internas é chamada fora da função externa que as contém, um fechamento é formado. Em termos simples, é "uma função cria outra função dentro, e a última função pode ler as variáveis na função acima, e a última função pode ser chamada de 'fechamento'".
2. Qual é o uso de fechamentos?
Através da minha extensa revisão, se dissermos "usando o fechamento, podemos fazer muitas coisas. Por exemplo, simulamos o estilo de código orientado a objetos; expressar o código de maneira mais elegante e concisa; e melhorar a eficiência da execução do código em alguns aspectos", ele se sentirá vazio? Isso será melhor? Como não existe um escopo real no nível de bloco no JavaScript, mas para declarar algumas variáveis locais que somente a função pode usar, usaremos o fechamento, para que possamos reduzir bastante as variáveis no escopo global e purificar o escopo global.
Aqui estão alguns exemplos:
1. Função auto-executiva anônima
Sabemos que, se todas as variáveis não forem adicionadas à palavra -chave VAR, o padrão será adicionado às propriedades do objeto global. Existem muitas desvantagens em adicionar essas variáveis temporárias ao objeto global.
Por exemplo: Outras funções podem usar mal essas variáveis; fazendo com que o objeto global seja muito grande e afete a velocidade de acesso (porque o valor da variável precisa ser percorrido da cadeia de protótipo).
Em toda vez que usamos a variável, usamos a palavra -chave VAR. Em situações reais, geralmente encontramos uma situação em que algumas funções precisam ser executadas uma vez e suas variáveis internas não precisam ser mantidas.
Por exemplo, na inicialização da interface do usuário, podemos usar o fechamento:
var dados = {tabela: [], árvore: {}}; (function (dm) {for (var i = 0; i <dm.table.rows; i ++) {var row = dm.table.Rows [i]; para (var j = 0; j <row.cells; i ++) {drawCell (i, j);}}}) (data);Criamos uma função anônima e a executamos imediatamente. Como o externo não pode se referir às variáveis dentro dele, o recurso será liberado imediatamente após a execução da função. A chave é não poluir o objeto global.
2. Cache de resultado
Encontraremos muitas situações em desenvolvimento. Imagine que temos um objeto de função muito demorado que leva muito tempo para processar cada chamada. Em seguida, precisamos armazenar o valor calculado. Ao chamar essa função, procuramos primeiro no cache. Se não puder ser encontrado, executaremos cálculos e atualizaremos o cache e retornaremos o valor. Se for encontrado, podemos retornar diretamente o valor encontrado. Os fechamentos fazem exatamente isso porque não liberam referências externas, para que os valores dentro da função possam ser preservados.
var cachedSearchBox = (function () {var cache = {}, count = []; return {AnexesearchBox: function (dsid) {if (dsid em cache) {// se o resultado estiver no cache de cache [dsid]; // retornar o objeto no cache diretamente} var fsb = ukik. cache [dsid] = fsb; // Atualizar cache if (count.length> 100) {// tamanho do cache de segurança <= 100 excluir cache [count.shift ()]; CachedSearchBox.attachSearchBox ("input");Dessa forma, leremos o objeto do cache na segunda chamada.
3. Embalagem
var pessoa = function () {// O escopo da variável está dentro da função e o nome Var não pode ser acessado fora. var name = "padrão"; return {getName: function () {return name; }, setName: function (newName) {name = newName; }}} (); print (Person.name); // Acesso diretamente, o resultado é impressão indefinida (PERSON.GETNAME ()); pessoa.setName ("Abruzzi"); print (Person.getName ());4. Implementar classes e herança
function Person () {var name = "padrão"; return {getName: function () {return name; }, setName: function (newName) {name = newName; }}}; var p = nova pessoa (); p.setName ("Tom"); alerta (p.getName ()); var jack = function () {}; // herdado da pessoa jack.prototype = new Person (); // Adicione o método privado jack.prototype.say = function () {alert ("Olá, meu nome é jack"); }; var j = new Jack (); J.SetName ("Jack"); J.Say (); alerta (j.getName ());No final da redação, não sei que, no final, todos descobriram que realmente usaram muito disso nos projetos que fez. De qualquer forma, eu o encontrei, e foi assim que existem fechamentos.
Embora seja clichê, ainda é muito importante. Quanto aos defeitos dos fechamentos, basta dizer que, se você não estiver abusando de fechamentos, isso levará ao vazamento de memória. Qual é o vazamento de memória no Baidu?^_^.
A breve análise e interpretação acima do fechamento no JavaScript (leitura obrigatória) é 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.