O que exatamente significa “fechamento” referem-se em JavaScript?
-
05-07-2019 - |
Pergunta
Eu entendo o que fechamentos são, mas eu estou tendo alguns problemas grokking exatamente o que o termo closure
se refere. Eu vi o termo usado em muitos sites, mas raramente eles concordam com a definição real do mesmo.
- É as variáveis ??que são mantidos no quadro de pilha?
- É a função que está sendo devolvido?
- É o escopo da função exterior?
- É o escopo da função interna (devolvidos)?
- É talvez o conceito de manter as variáveis ??na pilha-frame depois de voltar a função?
Alguém pode me dizer exatamente o que closure
refere-se a?
Solução
A partir JavaScript Closures
Dois resumos de uma frase:
Um fechamento é as variáveis ??locais para um função - mantido vivo após a função voltou, ou
Um fecho é uma pilha de quadro que está não desalocada quando a função retorna. (Como se uma 'pilha-frame' eram malloc'ed em vez de estar na pilha!)
Um artigo muito bom sobre o encerramento
A "fechamento" é uma expressão (Tipicamente uma função) que pode ter variáveis ??livres, juntamente com uma ambiente que liga essas variáveis (Que "fecha" a expressão).
A explicação simples de um encerramento é ECMAScript que permite interna funções; definições de funções e expressões de função que estão dentro os corpos das funções de outras funções. E que essas funções internas são permitido o acesso a todos os locais variáveis, parâmetros e declarou funções internas dentro do seu exterior funções). Um fecho é formado quando uma dessas funções internas é feita exterior acessível da função em que estava contido, de modo que ele pode ser executado após a função externa Voltou. Altura em que ainda tem acesso às variáveis ??locais, e parâmetros de função interno declarações de sua função exterior. Essas variáveis ??locais, parâmetros e declarações de função (inicialmente) têm os valores que tinham quando a função exterior e pode ser devolvido interagiu com pela função interna.
Um bom exemplo aqui
Outras dicas
É uma função que "detém" uma referência ou referências a algo em outro escopo. Por exemplo:
var myArrayOfFunctions = [];
for(var i = 0; i<3: i++)
{
//Note how the function being defined uses i,
//where i lives in the parent's scope, this creates a closure
myArrayOfFunctions[i] = function(a) { return a + i;}
}
myArrayOfFunctions[0](5); //Prints 8 WTF!
myArrayOfFunctions[1](5); //8 again
myArrayOfFunctions[2](5); //Well, this 8 was expected
Isso acontece porque quando as funções são "criadas", eles não copiar o valor de i, que possuem uma referência ao i, por isso, quando nós chamamos as funções que usar o valor atual de i que é 3.
Para mim, os encerramentos em JS permite que você faça o seguinte.
"A" permanece disponível na função interna quando adicionado a "b" embora seja declarada fora.
function adder(a){
return function(b){
return a + b;
};
}
var add5 = adder(5);
alert( add5(10) );
Para um uso extremo de encerramentos JS, você pode ter um olhar para o código fonte da biblioteca PURE (um motor de templates JS)
Tanto quanto eu posso dizer, um fechamento é uma função definida dentro de outra função que sobrevive âmbito da função pai. Um exemplo comum é retornos de chamada:
function delay_message(msg)
{
setTimeout(function closure() { alert(msg); }, 1000);
}
Neste caso, o function closure
acima é definida dentro do corpo de delay_message
, mas a definição da função - assim como msg
variável da função pai -. Sobreviver ao âmbito da chamada de função delay_message
Considere o seguinte código que cria um fecho com variáveis ??a e b
closure=(function(){
var a=3
var b=5
return function(operation){
return operation(a,b)
}
}())
// The variables a and b are now part of the closure (They are retained even after the outer function returns)
closure(function(x,y){return x+y}) // outputs 8
closure(function(x,y){return x*y}) // outputs 15`
Este encerramento particular pode agora tomar qualquer função que opera sobre as variáveis ??a e b
Essencialmente um fechamento é um corpo da função fechou sobre seus identificadores (variáveis) dentro de seu ambiente local.
Um fecho é um valor da função criada a partir de uma expressão declaração função aninhada ou função (isto é, expressão lambda) cujo corpo contém uma ou mais referências a variáveis ??declarada num exterior (mas não global) âmbito.
meios de fecho uma função (função exterior) contendo uma outra função (função interna).
O encerramento é usado para proteger os dados.
o uso de mais perto é demostrated no link de vídeo fornecer abaixo: